From b338b2d5bf37792c5f7465a9616c86fbe0449381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 14 Oct 2020 03:57:51 +0200 Subject: [PATCH 01/72] sparkles: Begin working on Sponge support --- cloud-minecraft/cloud-sponge/build.gradle | 10 ++ .../sponge/CloudCommandRegistrar.java | 134 ++++++++++++++++++ .../sponge/CloudInjectionModule.java | 60 ++++++++ .../sponge/SpongeCommandManager.java | 120 ++++++++++++++++ .../sponge/SpongeRegistrationHandler.java | 120 ++++++++++++++++ .../commandframework/sponge/package-info.java | 28 ++++ 6 files changed, 472 insertions(+) create mode 100644 cloud-minecraft/cloud-sponge/build.gradle create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java diff --git a/cloud-minecraft/cloud-sponge/build.gradle b/cloud-minecraft/cloud-sponge/build.gradle new file mode 100644 index 00000000..9da0ca87 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/build.gradle @@ -0,0 +1,10 @@ +repositories { + maven { url("https://repo-new.spongepowered.org/repository/maven-snapshots/") } +} + +dependencies { + api project(':cloud-core') + api project(':cloud-brigadier'); + implementation('org.spongepowered:spongeapi:8.0.0-20201013.161342-196') + implementation('com.mojang:brigadier:1.0.17') +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java new file mode 100644 index 00000000..47876c04 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java @@ -0,0 +1,134 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.Command; +import com.google.common.reflect.TypeToken; +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.manager.CommandFailedRegistrationException; +import org.spongepowered.api.command.manager.CommandMapping; +import org.spongepowered.api.command.registrar.CommandRegistrar; +import org.spongepowered.plugin.PluginContainer; + +import java.util.List; +import java.util.Optional; + +final class CloudCommandRegistrar implements CommandRegistrar> { + + private final SpongeCommandManager commandManager; + + CloudCommandRegistrar(final @NonNull SpongeCommandManager commandManager) { + this.commandManager = commandManager; + } + + @Override + public TypeToken> handledType() { + return new TypeToken>() {}; + } + + @Override + public CommandMapping register( + final PluginContainer container, final Command command, final String primaryAlias, final String... secondaryAliases + ) throws CommandFailedRegistrationException { + Sponge.getCommandManager().registerAlias( + this, + this.commandManager.getOwningPlugin(), + null, /* Fix */ + primaryAlias, + secondaryAliases + ); + return null; + } + + @Override + public CommandResult process( + final CommandCause cause, + final CommandMapping mapping, + final String command, + final String arguments + ) { + String input = command; + if (!arguments.isEmpty()) { + input = input + ' ' + arguments; + } + commandManager.executeCommand( + this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()), + input + ).whenComplete((result, throwable) -> { + /* Copy from cloud-velocity */ + }); + /* We do our own error handling */ + return CommandResult.success(); + } + + @Override + public List suggestions( + final CommandCause cause, + final CommandMapping mapping, + final String command, + final String arguments + ) { + String suggestionQuery = command + ' '; + if (!arguments.isEmpty()) { + suggestionQuery = suggestionQuery + arguments + ' '; + } + return this.commandManager.suggest( + this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()), + suggestionQuery + ); + } + + @Override + public Optional help( + final CommandCause cause, + final CommandMapping mapping + ) { + return Optional.empty(); + } + + @Override + public boolean canExecute(final CommandCause cause, + final CommandMapping mapping) { + /* Check permission & also check the executor type */ + final C sender = this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()); + /* We also need to find the command */ + return true; + } + + @Override + public void reset() { + /* We need to figure out how to implement this */ + } + + @Override + public ResourceKey getKey() { + return this.commandManager.getResourceKey(); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java new file mode 100644 index 00000000..5da3bfc2 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -0,0 +1,60 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.CommandTree; +import cloud.commandframework.execution.CommandExecutionCoordinator; +import com.google.inject.AbstractModule; +import com.google.inject.TypeLiteral; +import org.checkerframework.checker.nullness.qual.NonNull; + +import java.util.function.Function; + +/** + * Guice injection module that allows you to inject into {@link SpongeCommandManager} + * + * @param Command sender type + */ +public final class CloudInjectionModule extends AbstractModule { + + private final Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinatorFunction; + + /** + * Create a new injection module + * + * @param coordinatorFunction Execution coordinator instance factory + */ + public CloudInjectionModule( + final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> coordinatorFunction + ) { + this.commandExecutionCoordinatorFunction = coordinatorFunction; + } + + @Override + protected void configure() { + this.bind(new TypeLiteral, CommandExecutionCoordinator>>(){}) + .toInstance(this.commandExecutionCoordinatorFunction); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java new file mode 100644 index 00000000..4b48cbd6 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -0,0 +1,120 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.CommandManager; +import cloud.commandframework.CommandTree; +import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.meta.CommandMeta; +import cloud.commandframework.meta.SimpleCommandMeta; +import com.google.inject.Inject; +import com.google.inject.Module; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.lifecycle.RegisterCatalogRegistryEvent; +import org.spongepowered.api.service.permission.Subject; +import org.spongepowered.plugin.PluginContainer; + +import java.util.function.Function; + +/** + * Command manager for Sponge v8. + *

+ * The manager supports Guice injection + * as long as the {@link CloudInjectionModule} is present in the injector. + * This can be achieved by using {@link com.google.inject.Injector#createChildInjector(Module...)} + * + * @param Command sender type + */ +public class SpongeCommandManager extends CommandManager { + + private final PluginContainer pluginContainer; + private final Function subjectMapper; + private final Function backwardsSubjectMapper; + + /** + * Create a new command manager instance + * + * @param pluginContainer Owning plugin + * @param commandExecutionCoordinator Execution coordinator instance + * @param subjectMapper Function mapping the custom command sender type to a Sponge subject + * @param backwardsSubjectMapper Function mapping Sponge subjects to the custom command sender type + */ + @Inject + public SpongeCommandManager( + final @NonNull PluginContainer pluginContainer, + final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, + final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, + final @NonNull Function<@NonNull Subject, @NonNull C> backwardsSubjectMapper + ) { + super(commandExecutionCoordinator, new SpongeRegistrationHandler()); + this.pluginContainer = pluginContainer; + this.subjectMapper = subjectMapper; + this.backwardsSubjectMapper = backwardsSubjectMapper; + Sponge.getEventManager().registerListeners(this.pluginContainer, this); + } + + @Override + public final boolean hasPermission( + @NonNull final C sender, + @NonNull final String permission + ) { + return this.subjectMapper.apply(sender).hasPermission(permission); + } + + @Override + public final @NonNull CommandMeta createDefaultCommandMeta() { + return SimpleCommandMeta.empty(); + } + + /** + * Get the plugin that owns this command manager instance + * + * @return Owning plugin + */ + public final @NonNull PluginContainer getOwningPlugin() { + return this.pluginContainer; + } + + @NonNull + final Function<@NonNull Subject, @NonNull C> getBackwardsSubjectMapper() { + return this.backwardsSubjectMapper; + } + + @Listener + private void onRegistryEvent(final RegisterCatalogRegistryEvent event) { + event.register( + CloudCommandRegistrar.class, + this.getResourceKey() + ); + } + + @NonNull + final ResourceKey getResourceKey() { + return ResourceKey.builder().namespace(this.pluginContainer).value("cloud-command-manager").build(); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java new file mode 100644 index 00000000..56b4c43d --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -0,0 +1,120 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.Command; +import cloud.commandframework.arguments.StaticArgument; +import cloud.commandframework.brigadier.CloudBrigadierManager; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.internal.CommandRegistrationHandler; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.SystemSubject; +import org.spongepowered.plugin.PluginContainer; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; + +final class SpongeRegistrationHandler implements CommandRegistrationHandler { + + private final MethodHandle commandRegistrationMethodHandle; + private CloudBrigadierManager brigadierManager; + private SpongeCommandManager commandManager; + + SpongeRegistrationHandler() { + try { + final Class brigadierCommandRegistrar = + Class.forName("org.spongepowered.common.command.registrar.BrigadierCommandRegistrar"); + /* + The reason we're using the private method here is because we need to allow for duplicates, whereas + the public register method doesn't. This way we can indicate whether or not we do actually allow duplicates. + + The reason we need to allow for duplicates is because the same command is registered every time + a subcommand is added to it. + */ + final Method method = brigadierCommandRegistrar.getMethod( + "registerInternal", + PluginContainer.class, + LiteralArgumentBuilder.class, + String.class, + String[].class, + Boolean.class + ); + method.setAccessible(true); + commandRegistrationMethodHandle = MethodHandles.lookup().unreflect(method); + } catch (final Exception e) { + /* Ugly */ + throw new RuntimeException(e); + } + } + + void initialize( + final @NonNull SpongeCommandManager commandManager, + final @NonNull SystemSubject subject + ) { + this.commandManager = commandManager; + brigadierManager = new CloudBrigadierManager<>( + commandManager, + () -> new CommandContext<>( + commandManager.getBackwardsSubjectMapper().apply(subject), + commandManager.getCaptionRegistry() + ) + ); + } + + @Override + public boolean registerCommand(@NonNull final Command command) { + final StaticArgument staticArgument = (StaticArgument) command.getArguments().get(0); + final String primaryAlias = staticArgument.getName(); + final String[] aliases = staticArgument.getAlternativeAliases().toArray(new String[0]); + final LiteralCommandNode literalCommandNode = null; + /* + this.brigadierManager.createLiteralCommandNode( + command.getArguments().get(0).getName(), + (Command) command, + (c, p) -> this.manager.hasPermission( + this.manager.getCommandSenderMapper().apply(c), + p + ), + true, + s -> {} + ); + */ + try { + this.commandRegistrationMethodHandle.invokeWithArguments( + this.commandManager.getOwningPlugin(), + literalCommandNode.createBuilder(), + primaryAlias, + aliases, + true + ); + } catch (final Throwable throwable) { + throwable.printStackTrace(); + } + return true; + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java new file mode 100644 index 00000000..dbef4169 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java @@ -0,0 +1,28 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +/** + * Cloud for sponge v8 + */ +package cloud.commandframework.sponge; From baab901e0c2e1dd13bceca1492e13c7fd3a2b16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 15 Oct 2020 21:15:35 +0200 Subject: [PATCH 02/72] sparkles: Improve the Sponge module --- cloud-minecraft/cloud-sponge/build.gradle | 1 + .../sponge/CloudCommandRegistrar.java | 134 ------------------ .../sponge/SpongeCommandManager.java | 22 +-- .../sponge/SpongeRegistrationHandler.java | 31 ++-- 4 files changed, 29 insertions(+), 159 deletions(-) delete mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java diff --git a/cloud-minecraft/cloud-sponge/build.gradle b/cloud-minecraft/cloud-sponge/build.gradle index 9da0ca87..274e48cf 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle +++ b/cloud-minecraft/cloud-sponge/build.gradle @@ -6,5 +6,6 @@ dependencies { api project(':cloud-core') api project(':cloud-brigadier'); implementation('org.spongepowered:spongeapi:8.0.0-20201013.161342-196') + implementation('org.spongepowered:spongecommon:8.0.0-20201013.161342-196') implementation('com.mojang:brigadier:1.0.17') } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java deleted file mode 100644 index 47876c04..00000000 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudCommandRegistrar.java +++ /dev/null @@ -1,134 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2020 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge; - -import cloud.commandframework.Command; -import com.google.common.reflect.TypeToken; -import net.kyori.adventure.text.Component; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandCause; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.manager.CommandFailedRegistrationException; -import org.spongepowered.api.command.manager.CommandMapping; -import org.spongepowered.api.command.registrar.CommandRegistrar; -import org.spongepowered.plugin.PluginContainer; - -import java.util.List; -import java.util.Optional; - -final class CloudCommandRegistrar implements CommandRegistrar> { - - private final SpongeCommandManager commandManager; - - CloudCommandRegistrar(final @NonNull SpongeCommandManager commandManager) { - this.commandManager = commandManager; - } - - @Override - public TypeToken> handledType() { - return new TypeToken>() {}; - } - - @Override - public CommandMapping register( - final PluginContainer container, final Command command, final String primaryAlias, final String... secondaryAliases - ) throws CommandFailedRegistrationException { - Sponge.getCommandManager().registerAlias( - this, - this.commandManager.getOwningPlugin(), - null, /* Fix */ - primaryAlias, - secondaryAliases - ); - return null; - } - - @Override - public CommandResult process( - final CommandCause cause, - final CommandMapping mapping, - final String command, - final String arguments - ) { - String input = command; - if (!arguments.isEmpty()) { - input = input + ' ' + arguments; - } - commandManager.executeCommand( - this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()), - input - ).whenComplete((result, throwable) -> { - /* Copy from cloud-velocity */ - }); - /* We do our own error handling */ - return CommandResult.success(); - } - - @Override - public List suggestions( - final CommandCause cause, - final CommandMapping mapping, - final String command, - final String arguments - ) { - String suggestionQuery = command + ' '; - if (!arguments.isEmpty()) { - suggestionQuery = suggestionQuery + arguments + ' '; - } - return this.commandManager.suggest( - this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()), - suggestionQuery - ); - } - - @Override - public Optional help( - final CommandCause cause, - final CommandMapping mapping - ) { - return Optional.empty(); - } - - @Override - public boolean canExecute(final CommandCause cause, - final CommandMapping mapping) { - /* Check permission & also check the executor type */ - final C sender = this.commandManager.getBackwardsSubjectMapper().apply(cause.getSubject()); - /* We also need to find the command */ - return true; - } - - @Override - public void reset() { - /* We need to figure out how to implement this */ - } - - @Override - public ResourceKey getKey() { - return this.commandManager.getResourceKey(); - } - -} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 4b48cbd6..6cc19264 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -30,11 +30,12 @@ import cloud.commandframework.meta.SimpleCommandMeta; import com.google.inject.Inject; import com.google.inject.Module; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.lifecycle.RegisterCatalogRegistryEvent; +import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; import org.spongepowered.api.service.permission.Subject; import org.spongepowered.plugin.PluginContainer; @@ -53,7 +54,7 @@ public class SpongeCommandManager extends CommandManager { private final PluginContainer pluginContainer; private final Function subjectMapper; - private final Function backwardsSubjectMapper; + private final Function backwardsSubjectMapper; /** * Create a new command manager instance @@ -68,7 +69,7 @@ public SpongeCommandManager( final @NonNull PluginContainer pluginContainer, final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, - final @NonNull Function<@NonNull Subject, @NonNull C> backwardsSubjectMapper + final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper ) { super(commandExecutionCoordinator, new SpongeRegistrationHandler()); this.pluginContainer = pluginContainer; @@ -100,21 +101,12 @@ public final boolean hasPermission( } @NonNull - final Function<@NonNull Subject, @NonNull C> getBackwardsSubjectMapper() { + final Function<@NonNull CommandCause, @NonNull C> getBackwardsSubjectMapper() { return this.backwardsSubjectMapper; } @Listener - private void onRegistryEvent(final RegisterCatalogRegistryEvent event) { - event.register( - CloudCommandRegistrar.class, - this.getResourceKey() - ); - } - - @NonNull - final ResourceKey getResourceKey() { - return ResourceKey.builder().namespace(this.pluginContainer).value("cloud-command-manager").build(); + private void onRegistryEvent(final RegisterCommandEvent event) { } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 56b4c43d..74845cd6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -28,15 +28,18 @@ import cloud.commandframework.brigadier.CloudBrigadierManager; import cloud.commandframework.context.CommandContext; import cloud.commandframework.internal.CommandRegistrationHandler; +import cloud.commandframework.permission.CommandPermission; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.LiteralCommandNode; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.SystemSubject; +import org.spongepowered.api.command.CommandCause; import org.spongepowered.plugin.PluginContainer; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; +import java.util.function.BiPredicate; final class SpongeRegistrationHandler implements CommandRegistrationHandler { @@ -79,7 +82,9 @@ void initialize( brigadierManager = new CloudBrigadierManager<>( commandManager, () -> new CommandContext<>( - commandManager.getBackwardsSubjectMapper().apply(subject), + commandManager.getBackwardsSubjectMapper().apply( + CommandCause.create() /* This is bad, fix! */ + ), commandManager.getCaptionRegistry() ) ); @@ -90,19 +95,25 @@ public boolean registerCommand(@NonNull final Command command) { final StaticArgument staticArgument = (StaticArgument) command.getArguments().get(0); final String primaryAlias = staticArgument.getName(); final String[] aliases = staticArgument.getAlternativeAliases().toArray(new String[0]); - final LiteralCommandNode literalCommandNode = null; - /* - this.brigadierManager.createLiteralCommandNode( + @SuppressWarnings("all") + final LiteralCommandNode literalCommandNode = this.brigadierManager.createLiteralCommandNode( command.getArguments().get(0).getName(), (Command) command, - (c, p) -> this.manager.hasPermission( - this.manager.getCommandSenderMapper().apply(c), - p + (BiPredicate) (o, permission) -> commandManager.hasPermission( + commandManager.getBackwardsSubjectMapper().apply((CommandCause) o), + (CommandPermission) permission ), - true, - s -> {} + false, + (com.mojang.brigadier.Command) context -> { + commandManager.executeCommand( + commandManager.getBackwardsSubjectMapper().apply((CommandCause) context.getSource()), + context.getInput() + ).whenComplete(((result, throwable) -> { + + })); + return com.mojang.brigadier.Command.SINGLE_SUCCESS; + } ); - */ try { this.commandRegistrationMethodHandle.invokeWithArguments( this.commandManager.getOwningPlugin(), From 4a34b7f178c567272f14cb65ba0ab824dcde0e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Fri, 16 Oct 2020 22:54:23 +0200 Subject: [PATCH 03/72] sparkles: Initial work on Sponge v8 --- .../sponge/CloudInjectionModule.java | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index 5da3bfc2..da2fcd0c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -26,35 +26,64 @@ import cloud.commandframework.CommandTree; import cloud.commandframework.execution.CommandExecutionCoordinator; import com.google.inject.AbstractModule; -import com.google.inject.TypeLiteral; +import com.google.inject.Key; +import com.google.inject.util.Types; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.service.permission.Subject; +import java.lang.reflect.Type; import java.util.function.Function; /** - * Guice injection module that allows you to inject into {@link SpongeCommandManager} + * Injection module that allows for {@link SpongeCommandManager} to be injectable * * @param Command sender type */ public final class CloudInjectionModule extends AbstractModule { - private final Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinatorFunction; + private final Class commandSenderType; + private final Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator; + private final Function<@NonNull C, @NonNull Subject> subjectMapper; + private final Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper; /** - * Create a new injection module + * Create a new child injection module * - * @param coordinatorFunction Execution coordinator instance factory + * @param commandSenderType Your command sender type + * @param commandExecutionCoordinator Command execution coordinator + * @param subjectMapper Mapper to command source from the custom command sender type + * @param backwardsSubjectMapper Mapper from the custom command sender type to a velocity command source */ public CloudInjectionModule( - final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> coordinatorFunction + final @NonNull Class commandSenderType, + final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, + final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, + final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper ) { - this.commandExecutionCoordinatorFunction = coordinatorFunction; + this.commandSenderType = commandSenderType; + this.commandExecutionCoordinator = commandExecutionCoordinator; + this.subjectMapper = subjectMapper; + this.backwardsSubjectMapper = backwardsSubjectMapper; } @Override protected void configure() { - this.bind(new TypeLiteral, CommandExecutionCoordinator>>(){}) - .toInstance(this.commandExecutionCoordinatorFunction); + final Type commandTreeType = Types.newParameterizedType(CommandTree.class, this.commandSenderType); + final Type commandExecutionCoordinatorType = Types.newParameterizedType(CommandExecutionCoordinator.class, + this.commandSenderType); + final Type executorFunction = Types.newParameterizedType(Function.class, commandTreeType, + commandExecutionCoordinatorType); + final Key executorFunctionKey = Key.get(executorFunction); + this.bind(executorFunctionKey).toInstance(this.commandExecutionCoordinator); + final Type commandSenderMapperFunction = Types.newParameterizedType(Function.class, + this.commandSenderType, Subject.class); + final Key commandSenderMapperFunctionKey = Key.get(commandSenderMapperFunction); + this.bind(commandSenderMapperFunctionKey).toInstance(this.subjectMapper); + final Type backwardsCommandSenderMapperFunction = Types.newParameterizedType(Function.class, CommandCause.class, + this.commandSenderType); + final Key backwardsCommandSenderMapperFunctionKey = Key.get(backwardsCommandSenderMapperFunction); + this.bind(backwardsCommandSenderMapperFunctionKey).toInstance(this.backwardsSubjectMapper); } } From 642d00b2cf2634e58654aaa91299efc4b2e7a24e Mon Sep 17 00:00:00 2001 From: Zach Levis Date: Sun, 28 Mar 2021 17:50:30 -0700 Subject: [PATCH 04/72] sponge: Update after rebase --- cloud-minecraft/cloud-sponge/build.gradle | 11 ----------- cloud-minecraft/cloud-sponge/build.gradle.kts | 7 +++++++ .../commandframework/sponge/SpongeCommandManager.java | 5 +++-- .../sponge/SpongeRegistrationHandler.java | 6 +++--- settings.gradle.kts | 3 +++ 5 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 cloud-minecraft/cloud-sponge/build.gradle create mode 100644 cloud-minecraft/cloud-sponge/build.gradle.kts diff --git a/cloud-minecraft/cloud-sponge/build.gradle b/cloud-minecraft/cloud-sponge/build.gradle deleted file mode 100644 index 274e48cf..00000000 --- a/cloud-minecraft/cloud-sponge/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -repositories { - maven { url("https://repo-new.spongepowered.org/repository/maven-snapshots/") } -} - -dependencies { - api project(':cloud-core') - api project(':cloud-brigadier'); - implementation('org.spongepowered:spongeapi:8.0.0-20201013.161342-196') - implementation('org.spongepowered:spongecommon:8.0.0-20201013.161342-196') - implementation('com.mojang:brigadier:1.0.17') -} diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts new file mode 100644 index 00000000..b2da0ac4 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -0,0 +1,7 @@ +dependencies { + api(project(":cloud-core")) + api(project(":cloud-brigadier")) + implementation("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") + compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") + implementation("com.mojang:brigadier:1.0.17") +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 6cc19264..6c414cab 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -71,11 +71,12 @@ public SpongeCommandManager( final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper ) { - super(commandExecutionCoordinator, new SpongeRegistrationHandler()); + super(commandExecutionCoordinator, new SpongeRegistrationHandler()); + ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this, Sponge.systemSubject()); this.pluginContainer = pluginContainer; this.subjectMapper = subjectMapper; this.backwardsSubjectMapper = backwardsSubjectMapper; - Sponge.getEventManager().registerListeners(this.pluginContainer, this); + Sponge.eventManager().registerListeners(this.pluginContainer, this); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 74845cd6..04211d10 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -67,7 +67,7 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { Boolean.class ); method.setAccessible(true); - commandRegistrationMethodHandle = MethodHandles.lookup().unreflect(method); + this.commandRegistrationMethodHandle = MethodHandles.lookup().unreflect(method); } catch (final Exception e) { /* Ugly */ throw new RuntimeException(e); @@ -79,13 +79,13 @@ void initialize( final @NonNull SystemSubject subject ) { this.commandManager = commandManager; - brigadierManager = new CloudBrigadierManager<>( + this.brigadierManager = new CloudBrigadierManager<>( commandManager, () -> new CommandContext<>( commandManager.getBackwardsSubjectMapper().apply( CommandCause.create() /* This is bad, fix! */ ), - commandManager.getCaptionRegistry() + commandManager ) ); } diff --git a/settings.gradle.kts b/settings.gradle.kts index e56e1e37..80b090d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,3 +39,6 @@ include("cloud-fabric") include("cloud-fabric/common-repack") findProject(":cloud-fabric/common-repack")?.name = "cloud-minecraft-modded-common-fabric-repack" include("cloud-neoforge") +include("cloud-sponge") +include("examples/cloud-sponge") +findProject(":examples/cloud-sponge")?.name = "cloud-sponge" From 750b6cc76f04fa8a2d48ea569b8ad5863b313a9d Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 18 Apr 2021 21:56:08 -0700 Subject: [PATCH 05/72] Map to Sponge API Command.Raw instead of directly to Brigadier --- cloud-minecraft/cloud-sponge/build.gradle.kts | 4 +- .../sponge/CloudInjectionModule.java | 44 +-- .../sponge/CloudSpongeCommand.java | 322 ++++++++++++++++++ .../sponge/SpongeCommandManager.java | 48 ++- .../sponge/SpongeRegistrationHandler.java | 122 +++---- .../commandframework/sponge/package-info.java | 4 +- 6 files changed, 414 insertions(+), 130 deletions(-) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index b2da0ac4..616543f5 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -1,7 +1,7 @@ dependencies { api(project(":cloud-core")) api(project(":cloud-brigadier")) - implementation("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") + compileOnly("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") - implementation("com.mojang:brigadier:1.0.17") + compileOnly("com.mojang:brigadier:1.0.17") } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index da2fcd0c..a60107ee 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2020 Alexander Söderberg & Contributors +// Copyright (c) 2021 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,7 +36,7 @@ import java.util.function.Function; /** - * Injection module that allows for {@link SpongeCommandManager} to be injectable + * Injection module that allows for {@link SpongeCommandManager} to be injectable. * * @param Command sender type */ @@ -44,46 +44,52 @@ public final class CloudInjectionModule extends AbstractModule { private final Class commandSenderType; private final Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator; - private final Function<@NonNull C, @NonNull Subject> subjectMapper; - private final Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper; + private final Function<@NonNull C, @NonNull CommandCause> causeMapper; + private final Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper; /** * Create a new child injection module * - * @param commandSenderType Your command sender type - * @param commandExecutionCoordinator Command execution coordinator - * @param subjectMapper Mapper to command source from the custom command sender type - * @param backwardsSubjectMapper Mapper from the custom command sender type to a velocity command source + * @param commandSenderType Your command sender type + * @param commandExecutionCoordinator Command execution coordinator + * @param causeMapper Mapper to command source from the custom command sender type + * @param backwardsCauseMapper Mapper from the custom command sender type to a velocity command source */ public CloudInjectionModule( final @NonNull Class commandSenderType, final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, - final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, - final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper + final @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper, + final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper ) { this.commandSenderType = commandSenderType; this.commandExecutionCoordinator = commandExecutionCoordinator; - this.subjectMapper = subjectMapper; - this.backwardsSubjectMapper = backwardsSubjectMapper; + this.causeMapper = causeMapper; + this.backwardsCauseMapper = backwardsCauseMapper; } + @SuppressWarnings({"unchecked", "rawtypes"}) @Override protected void configure() { final Type commandTreeType = Types.newParameterizedType(CommandTree.class, this.commandSenderType); - final Type commandExecutionCoordinatorType = Types.newParameterizedType(CommandExecutionCoordinator.class, - this.commandSenderType); + final Type commandExecutionCoordinatorType = Types.newParameterizedType( + CommandExecutionCoordinator.class, + this.commandSenderType + ); final Type executorFunction = Types.newParameterizedType(Function.class, commandTreeType, - commandExecutionCoordinatorType); + commandExecutionCoordinatorType + ); final Key executorFunctionKey = Key.get(executorFunction); this.bind(executorFunctionKey).toInstance(this.commandExecutionCoordinator); final Type commandSenderMapperFunction = Types.newParameterizedType(Function.class, - this.commandSenderType, Subject.class); + this.commandSenderType, Subject.class + ); final Key commandSenderMapperFunctionKey = Key.get(commandSenderMapperFunction); - this.bind(commandSenderMapperFunctionKey).toInstance(this.subjectMapper); + this.bind(commandSenderMapperFunctionKey).toInstance(this.causeMapper); final Type backwardsCommandSenderMapperFunction = Types.newParameterizedType(Function.class, CommandCause.class, - this.commandSenderType); + this.commandSenderType + ); final Key backwardsCommandSenderMapperFunctionKey = Key.get(backwardsCommandSenderMapperFunction); - this.bind(backwardsCommandSenderMapperFunctionKey).toInstance(this.backwardsSubjectMapper); + this.bind(backwardsCommandSenderMapperFunctionKey).toInstance(this.backwardsCauseMapper); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java new file mode 100644 index 00000000..ee1c74ea --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -0,0 +1,322 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.CommandTree; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.StaticArgument; +import cloud.commandframework.arguments.compound.FlagArgument; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.standard.BooleanArgument; +import cloud.commandframework.arguments.standard.ByteArgument; +import cloud.commandframework.arguments.standard.DoubleArgument; +import cloud.commandframework.arguments.standard.FloatArgument; +import cloud.commandframework.arguments.standard.IntegerArgument; +import cloud.commandframework.arguments.standard.ShortArgument; +import cloud.commandframework.arguments.standard.StringArgument; +import cloud.commandframework.arguments.standard.StringArrayArgument; +import cloud.commandframework.exceptions.ArgumentParseException; +import cloud.commandframework.exceptions.CommandExecutionException; +import cloud.commandframework.exceptions.InvalidCommandSenderException; +import cloud.commandframework.exceptions.InvalidSyntaxException; +import cloud.commandframework.exceptions.NoPermissionException; +import cloud.commandframework.exceptions.NoSuchCommandException; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.util.ComponentMessageThrowable; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.Command; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.parameter.ArgumentReader; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletionException; +import java.util.function.Function; + +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; +import static net.kyori.adventure.text.format.NamedTextColor.RED; + +final class CloudSpongeCommand implements Command.Raw { + + private static final Component NULL = Component.text("null"); + private static final Component MESSAGE_INTERNAL_ERROR = + text("An internal error occurred while attempting to perform this command.", RED); + private static final Component MESSAGE_NO_PERMS = + text("I'm sorry, but you do not have permission to perform this command. " + + "Please contact the server administrators if you believe that this is in error.", RED); + private static final Component MESSAGE_UNKNOWN_COMMAND = text("Unknown command. Type \"/help\" for help."); + + private final SpongeCommandManager commandManager; + private final String label; + + CloudSpongeCommand( + final @NonNull String label, + final @NonNull SpongeCommandManager commandManager + ) { + this.label = label; + this.commandManager = commandManager; + } + + @Override + public CommandResult process(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { + final C cloudSender = this.commandManager.backwardsCauseMapper().apply(cause); + final Audience audience = cause.audience(); + final String args = arguments.input(); + final String input; + if (args.isEmpty()) { + input = this.label; + } else { + input = this.label + " " + args; + } + this.commandManager.executeCommand(cloudSender, input).whenComplete((result, throwable) -> { + if (throwable == null) { + return; + } + if (throwable instanceof CompletionException) { + throwable = throwable.getCause(); + } + final Throwable finalThrowable = throwable; + if (throwable instanceof InvalidSyntaxException) { + this.commandManager.handleException(cloudSender, + InvalidSyntaxException.class, + (InvalidSyntaxException) throwable, (c, e) -> audience.sendMessage(TextComponent.ofChildren( + text("Invalid Command Syntax. Correct command syntax is: ", RED), + text("/" + ((InvalidSyntaxException) finalThrowable).getCorrectSyntax(), GRAY) + )) + ); + } else if (throwable instanceof InvalidCommandSenderException) { + this.commandManager.handleException(cloudSender, + InvalidCommandSenderException.class, + (InvalidCommandSenderException) throwable, (c, e) -> + audience.sendMessage(text(finalThrowable.getMessage(), RED)) + ); + } else if (throwable instanceof NoPermissionException) { + this.commandManager.handleException(cloudSender, + NoPermissionException.class, + (NoPermissionException) throwable, (c, e) -> + audience.sendMessage(MESSAGE_NO_PERMS) + ); + } else if (throwable instanceof NoSuchCommandException) { + this.commandManager.handleException(cloudSender, + NoSuchCommandException.class, + (NoSuchCommandException) throwable, (c, e) -> + audience.sendMessage(MESSAGE_UNKNOWN_COMMAND) + ); + } else if (throwable instanceof ArgumentParseException) { + this.commandManager.handleException(cloudSender, + ArgumentParseException.class, + (ArgumentParseException) throwable, (c, e) -> + audience.sendMessage(TextComponent.ofChildren( + text("Invalid Command Argument: ", RED), + getMessage(finalThrowable.getCause()).colorIfAbsent(GRAY) + )) + ); + } else if (throwable instanceof CommandExecutionException) { + this.commandManager.handleException(cloudSender, + CommandExecutionException.class, + (CommandExecutionException) throwable, (c, e) -> { + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + this.commandManager.getOwningPlugin().getLogger().error( + "Exception executing command handler", + finalThrowable.getCause() + ); + } + ); + } else { + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + this.commandManager.getOwningPlugin().getLogger().error( + "An unhandled exception was thrown during command execution", + throwable + ); + } + }); + return CommandResult.success(); + } + + private static Component getMessage(final Throwable throwable) { + final Component msg = ComponentMessageThrowable.getOrConvertMessage(throwable); + return msg == null ? NULL : msg; + } + + @Override + public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { + return this.commandManager.suggest( + this.commandManager.backwardsCauseMapper().apply(cause), + this.label + " " + arguments.input() + ); + } + + @Override + public boolean canExecute(final @NonNull CommandCause cause) { + return true; + } + + @Override + public Optional shortDescription(final CommandCause cause) { + return Optional.of(text("short desc!")); + } + + @Override + public Optional extendedDescription(final CommandCause cause) { + return Optional.of(text("long desc!")); + } + + @Override + public Optional help(final @NonNull CommandCause cause) { + return Raw.super.help(cause); + } + + @Override + public Component usage(final CommandCause cause) { + return text("usage!"); + } + + @Override + public CommandTreeNode.Root commandTree() { + final CommandTreeNode root = CommandTreeNode.root(); + + final CommandTree.Node> cloud = this.commandManager + .getCommandTree() + .getNamedNode(this.label); + + this.addChildren(root, cloud); + + return root.executable(); + } + + private void addChildren(final CommandTreeNode node, final CommandTree.Node> cloud) { + for (final CommandTree.Node> child : cloud.getChildren()) { + final CommandArgument value = child.getValue(); + final CommandTreeNode> treeNode; + if (value instanceof StaticArgument) { + treeNode = CommandTreeNode.literal(); + } else { + treeNode = this.toSponge(value); + } + this.addChildren(treeNode, child); + node.child(value.getName(), treeNode.executable()); + } + } + + private CommandTreeNode> toSponge(final CommandArgument value) { + final ArgumentParser parser = value.getParser(); + final Function>> mapper = + MAPPERS.get(parser.getClass()); + if (mapper != null) { + return mapper.apply(parser); + } + return ClientCompletionKeys.STRING.get().createNode().word(); + } + + private static final Map, Function>>> MAPPERS + = new HashMap<>(); + + static { + registerMapper(StringArgument.StringParser.class, stringParser -> { + final StringArgument.StringMode mode = stringParser.getStringMode(); + if (mode == StringArgument.StringMode.SINGLE) { + return ClientCompletionKeys.STRING.get().createNode().word(); + } else if (mode == StringArgument.StringMode.QUOTED) { + return ClientCompletionKeys.STRING.get().createNode(); + } else if (mode == StringArgument.StringMode.GREEDY) { + return ClientCompletionKeys.STRING.get().createNode().greedy(); + } + throw new IllegalStateException("Unknown string mode '" + mode + "'!"); + }); + registerMapper(ByteArgument.ByteParser.class, byteParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + node.min((int) byteParser.getMin()); + node.max((int) byteParser.getMax()); + return node; + }); + registerMapper(ShortArgument.ShortParser.class, shortParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + node.min((int) shortParser.getMin()); + node.max((int) shortParser.getMax()); + return node; + }); + registerMapper(IntegerArgument.IntegerParser.class, integerParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + final boolean hasMin = integerParser.getMin() != Integer.MIN_VALUE; + final boolean hasMax = integerParser.getMax() != Integer.MAX_VALUE; + if (hasMin) { + node.min(integerParser.getMin()); + } + if (hasMax) { + node.max(integerParser.getMax()); + } + return node; + }); + registerMapper(FloatArgument.FloatParser.class, floatParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); + final boolean hasMin = floatParser.getMin() != Float.NEGATIVE_INFINITY; + final boolean hasMax = floatParser.getMax() != Float.POSITIVE_INFINITY; + if (hasMin) { + node.min(floatParser.getMin()); + } + if (hasMax) { + node.max(floatParser.getMax()); + } + return node; + }); + registerMapper(DoubleArgument.DoubleParser.class, doubleParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); + final boolean hasMin = doubleParser.getMin() != Double.NEGATIVE_INFINITY; + final boolean hasMax = doubleParser.getMax() != Double.POSITIVE_INFINITY; + if (hasMin) { + node.min(doubleParser.getMin()); + } + if (hasMax) { + node.max(doubleParser.getMax()); + } + return node; + }); + registerMapper(BooleanArgument.BooleanParser.class, booleanParser -> ClientCompletionKeys.BOOL.get().createNode()); + registerMapper( + FlagArgument.FlagArgumentParser.class, + flagArgumentParser -> ClientCompletionKeys.STRING.get().createNode().greedy() + ); + registerMapper( + StringArrayArgument.StringArrayParser.class, + stringArrayParser -> ClientCompletionKeys.STRING.get().createNode().greedy() + ); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static > void registerMapper( + final @NonNull Class cloudType, + final @NonNull Function> mapper + ) { + MAPPERS.put(cloudType, (Function) mapper); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 6c414cab..0a919718 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2020 Alexander Söderberg & Contributors +// Copyright (c) 2021 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,19 +30,15 @@ import cloud.commandframework.meta.SimpleCommandMeta; import com.google.inject.Inject; import com.google.inject.Module; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; -import org.spongepowered.api.service.permission.Subject; import org.spongepowered.plugin.PluginContainer; import java.util.function.Function; /** - * Command manager for Sponge v8. + * Command manager for Sponge API v8. *

* The manager supports Guice injection * as long as the {@link CloudInjectionModule} is present in the injector. @@ -50,45 +46,46 @@ * * @param Command sender type */ -public class SpongeCommandManager extends CommandManager { +public final class SpongeCommandManager extends CommandManager { private final PluginContainer pluginContainer; - private final Function subjectMapper; - private final Function backwardsSubjectMapper; + private final Function causeMapper; + private final Function backwardsCauseMapper; /** * Create a new command manager instance * * @param pluginContainer Owning plugin * @param commandExecutionCoordinator Execution coordinator instance - * @param subjectMapper Function mapping the custom command sender type to a Sponge subject - * @param backwardsSubjectMapper Function mapping Sponge subjects to the custom command sender type + * @param causeMapper Function mapping the custom command sender type to a Sponge subject + * @param backwardsCauseMapper Function mapping Sponge subjects to the custom command sender type */ + @SuppressWarnings("unchecked") @Inject public SpongeCommandManager( final @NonNull PluginContainer pluginContainer, final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, - final @NonNull Function<@NonNull C, @NonNull Subject> subjectMapper, - final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsSubjectMapper + final @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper, + final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper ) { super(commandExecutionCoordinator, new SpongeRegistrationHandler()); - ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this, Sponge.systemSubject()); this.pluginContainer = pluginContainer; - this.subjectMapper = subjectMapper; - this.backwardsSubjectMapper = backwardsSubjectMapper; - Sponge.eventManager().registerListeners(this.pluginContainer, this); + ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this, Sponge.systemSubject()); + this.causeMapper = causeMapper; + this.backwardsCauseMapper = backwardsCauseMapper; + Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); } @Override - public final boolean hasPermission( + public boolean hasPermission( @NonNull final C sender, @NonNull final String permission ) { - return this.subjectMapper.apply(sender).hasPermission(permission); + return this.causeMapper.apply(sender).hasPermission(permission); } @Override - public final @NonNull CommandMeta createDefaultCommandMeta() { + public @NonNull CommandMeta createDefaultCommandMeta() { return SimpleCommandMeta.empty(); } @@ -97,17 +94,16 @@ public final boolean hasPermission( * * @return Owning plugin */ - public final @NonNull PluginContainer getOwningPlugin() { + public @NonNull PluginContainer getOwningPlugin() { return this.pluginContainer; } - @NonNull - final Function<@NonNull CommandCause, @NonNull C> getBackwardsSubjectMapper() { - return this.backwardsSubjectMapper; + @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper() { + return this.causeMapper; } - @Listener - private void onRegistryEvent(final RegisterCommandEvent event) { + @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper() { + return this.backwardsCauseMapper; } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 04211d10..87e00baf 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2020 Alexander Söderberg & Contributors +// Copyright (c) 2021 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,108 +23,68 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.Command; import cloud.commandframework.arguments.StaticArgument; -import cloud.commandframework.brigadier.CloudBrigadierManager; -import cloud.commandframework.context.CommandContext; import cloud.commandframework.internal.CommandRegistrationHandler; -import cloud.commandframework.permission.CommandPermission; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.tree.LiteralCommandNode; +import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.Sponge; import org.spongepowered.api.SystemSubject; -import org.spongepowered.api.command.CommandCause; -import org.spongepowered.plugin.PluginContainer; +import org.spongepowered.api.command.Command; +import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; -import java.util.function.BiPredicate; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static java.util.stream.Collectors.groupingBy; final class SpongeRegistrationHandler implements CommandRegistrationHandler { - private final MethodHandle commandRegistrationMethodHandle; - private CloudBrigadierManager brigadierManager; private SpongeCommandManager commandManager; + private final Set> registeredCommands = new HashSet<>(); SpongeRegistrationHandler() { - try { - final Class brigadierCommandRegistrar = - Class.forName("org.spongepowered.common.command.registrar.BrigadierCommandRegistrar"); - /* - The reason we're using the private method here is because we need to allow for duplicates, whereas - the public register method doesn't. This way we can indicate whether or not we do actually allow duplicates. + } - The reason we need to allow for duplicates is because the same command is registered every time - a subcommand is added to it. - */ - final Method method = brigadierCommandRegistrar.getMethod( - "registerInternal", - PluginContainer.class, - LiteralArgumentBuilder.class, - String.class, - String[].class, - Boolean.class - ); - method.setAccessible(true); - this.commandRegistrationMethodHandle = MethodHandles.lookup().unreflect(method); - } catch (final Exception e) { - /* Ugly */ - throw new RuntimeException(e); - } + //@Listener + public void handleRegistrationEvent(final RegisterCommandEvent event) { + this.registeredCommands.stream() + .collect(groupingBy(command -> command.getArguments().get(0).getName())) + .forEach((label, commands) -> + this.registerCommand(event, label, commands)); + } + + @SuppressWarnings("unchecked") + private void registerCommand( + final RegisterCommandEvent event, + final String label, + final List> commands + ) { + event.register( + this.commandManager.getOwningPlugin(), + new CloudSpongeCommand<>(label, this.commandManager), + label, + ((StaticArgument) commands.get(0).getArguments().get(0)).getAlternativeAliases().toArray(new String[0]) + ); } void initialize( final @NonNull SpongeCommandManager commandManager, final @NonNull SystemSubject subject - ) { + ) { this.commandManager = commandManager; - this.brigadierManager = new CloudBrigadierManager<>( - commandManager, - () -> new CommandContext<>( - commandManager.getBackwardsSubjectMapper().apply( - CommandCause.create() /* This is bad, fix! */ - ), - commandManager - ) + Sponge.eventManager().registerListener( + this.commandManager.getOwningPlugin(), + new TypeToken>() { + }, + this::handleRegistrationEvent ); } + @SuppressWarnings("unchecked") @Override - public boolean registerCommand(@NonNull final Command command) { - final StaticArgument staticArgument = (StaticArgument) command.getArguments().get(0); - final String primaryAlias = staticArgument.getName(); - final String[] aliases = staticArgument.getAlternativeAliases().toArray(new String[0]); - @SuppressWarnings("all") - final LiteralCommandNode literalCommandNode = this.brigadierManager.createLiteralCommandNode( - command.getArguments().get(0).getName(), - (Command) command, - (BiPredicate) (o, permission) -> commandManager.hasPermission( - commandManager.getBackwardsSubjectMapper().apply((CommandCause) o), - (CommandPermission) permission - ), - false, - (com.mojang.brigadier.Command) context -> { - commandManager.executeCommand( - commandManager.getBackwardsSubjectMapper().apply((CommandCause) context.getSource()), - context.getInput() - ).whenComplete(((result, throwable) -> { - - })); - return com.mojang.brigadier.Command.SINGLE_SUCCESS; - } - ); - try { - this.commandRegistrationMethodHandle.invokeWithArguments( - this.commandManager.getOwningPlugin(), - literalCommandNode.createBuilder(), - primaryAlias, - aliases, - true - ); - } catch (final Throwable throwable) { - throwable.printStackTrace(); - } + public boolean registerCommand(final cloud.commandframework.@NonNull Command command) { + this.registeredCommands.add((cloud.commandframework.Command) command); return true; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java index dbef4169..6fbb8025 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2020 Alexander Söderberg & Contributors +// Copyright (c) 2021 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,6 +23,6 @@ // /** - * Cloud for sponge v8 + * Cloud for Sponge API v8 */ package cloud.commandframework.sponge; From 50cd277de4984cdf30f88370c4e46376148cd4bc Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 18 Apr 2021 22:20:10 -0700 Subject: [PATCH 06/72] Lock registration after event --- .../cloud/commandframework/sponge/SpongeCommandManager.java | 4 ++++ .../commandframework/sponge/SpongeRegistrationHandler.java | 1 + 2 files changed, 5 insertions(+) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 0a919718..9fa1bafd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -106,4 +106,8 @@ public boolean hasPermission( return this.backwardsCauseMapper; } + void registrationCalled() { + this.lockRegistration(); + } + } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 87e00baf..9c88a653 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -48,6 +48,7 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { //@Listener public void handleRegistrationEvent(final RegisterCommandEvent event) { + this.commandManager.registrationCalled(); this.registeredCommands.stream() .collect(groupingBy(command -> command.getArguments().get(0).getName())) .forEach((label, commands) -> From 698cfa154e1e6d681db77b1d16ef40c76be32267 Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 18 Apr 2021 22:28:55 -0700 Subject: [PATCH 07/72] sponge: Add createNative to CloudInjectionModule --- .../sponge/CloudInjectionModule.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index a60107ee..0ca87540 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -34,6 +34,7 @@ import java.lang.reflect.Type; import java.util.function.Function; +import java.util.function.UnaryOperator; /** * Injection module that allows for {@link SpongeCommandManager} to be injectable. @@ -67,6 +68,24 @@ public CloudInjectionModule( this.backwardsCauseMapper = backwardsCauseMapper; } + /** + * Create a new child injection module using Sponge's {@link CommandCause} as the sender type. + * + * @param commandExecutionCoordinator Command execution coordinator + * @return new injection module + */ + public static @NonNull CloudInjectionModule<@NonNull CommandCause> createNative( + final @NonNull Function<@NonNull CommandTree<@NonNull CommandCause>, + @NonNull CommandExecutionCoordinator<@NonNull CommandCause>> commandExecutionCoordinator + ) { + return new CloudInjectionModule<>( + CommandCause.class, + commandExecutionCoordinator, + UnaryOperator.identity(), + UnaryOperator.identity() + ); + } + @SuppressWarnings({"unchecked", "rawtypes"}) @Override protected void configure() { From 75eeb6b69991438c593b5ea9cd6babc5039fc88a Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 20 Apr 2021 00:28:13 -0700 Subject: [PATCH 08/72] sponge: Add some argument types and an example/test plugin --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 - .../sponge/CloudInjectionModule.java | 8 +- .../sponge/CloudSpongeCommand.java | 108 +--------- .../sponge/NodeSupplyingArgumentParser.java | 45 ++++ .../sponge/SpongeCommandManager.java | 33 ++- .../sponge/SpongeParserMapper.java | 166 +++++++++++++++ .../argument/EnchantmentTypeArgument.java | 137 ++++++++++++ .../argument/NamedTextColorArgument.java | 122 +++++++++++ .../sponge/argument/OperatorArgument.java | 124 +++++++++++ .../sponge/argument/package-info.java | 27 +++ .../commandframework/sponge/package-info.java | 1 - examples/example-sponge/build.gradle.kts | 34 +++ .../examples/sponge/CloudExamplePlugin.java | 197 ++++++++++++++++++ 13 files changed, 888 insertions(+), 116 deletions(-) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java create mode 100644 examples/example-sponge/build.gradle.kts create mode 100644 examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index 616543f5..d748bf71 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -1,7 +1,5 @@ dependencies { api(project(":cloud-core")) - api(project(":cloud-brigadier")) compileOnly("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") - compileOnly("com.mojang:brigadier:1.0.17") } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index 0ca87540..cb98e691 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -49,12 +49,12 @@ public final class CloudInjectionModule extends AbstractModule { private final Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper; /** - * Create a new child injection module + * Create a new injection module. * * @param commandSenderType Your command sender type * @param commandExecutionCoordinator Command execution coordinator - * @param causeMapper Mapper to command source from the custom command sender type - * @param backwardsCauseMapper Mapper from the custom command sender type to a velocity command source + * @param causeMapper Function mapping the custom command sender type to a Sponge CommandCause + * @param backwardsCauseMapper Function mapping Sponge CommandCause to the custom command sender type */ public CloudInjectionModule( final @NonNull Class commandSenderType, @@ -69,7 +69,7 @@ public CloudInjectionModule( } /** - * Create a new child injection module using Sponge's {@link CommandCause} as the sender type. + * Create a new injection module using Sponge's {@link CommandCause} as the sender type. * * @param commandExecutionCoordinator Command execution coordinator * @return new injection module diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index ee1c74ea..fccb6c2e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -26,16 +26,6 @@ import cloud.commandframework.CommandTree; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.StaticArgument; -import cloud.commandframework.arguments.compound.FlagArgument; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.standard.BooleanArgument; -import cloud.commandframework.arguments.standard.ByteArgument; -import cloud.commandframework.arguments.standard.DoubleArgument; -import cloud.commandframework.arguments.standard.FloatArgument; -import cloud.commandframework.arguments.standard.IntegerArgument; -import cloud.commandframework.arguments.standard.ShortArgument; -import cloud.commandframework.arguments.standard.StringArgument; -import cloud.commandframework.arguments.standard.StringArrayArgument; import cloud.commandframework.exceptions.ArgumentParseException; import cloud.commandframework.exceptions.CommandExecutionException; import cloud.commandframework.exceptions.InvalidCommandSenderException; @@ -51,15 +41,11 @@ import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.parameter.ArgumentReader; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletionException; -import java.util.function.Function; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; @@ -220,103 +206,11 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node> toSponge(final CommandArgument value) { - final ArgumentParser parser = value.getParser(); - final Function>> mapper = - MAPPERS.get(parser.getClass()); - if (mapper != null) { - return mapper.apply(parser); - } - return ClientCompletionKeys.STRING.get().createNode().word(); - } - - private static final Map, Function>>> MAPPERS - = new HashMap<>(); - - static { - registerMapper(StringArgument.StringParser.class, stringParser -> { - final StringArgument.StringMode mode = stringParser.getStringMode(); - if (mode == StringArgument.StringMode.SINGLE) { - return ClientCompletionKeys.STRING.get().createNode().word(); - } else if (mode == StringArgument.StringMode.QUOTED) { - return ClientCompletionKeys.STRING.get().createNode(); - } else if (mode == StringArgument.StringMode.GREEDY) { - return ClientCompletionKeys.STRING.get().createNode().greedy(); - } - throw new IllegalStateException("Unknown string mode '" + mode + "'!"); - }); - registerMapper(ByteArgument.ByteParser.class, byteParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); - node.min((int) byteParser.getMin()); - node.max((int) byteParser.getMax()); - return node; - }); - registerMapper(ShortArgument.ShortParser.class, shortParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); - node.min((int) shortParser.getMin()); - node.max((int) shortParser.getMax()); - return node; - }); - registerMapper(IntegerArgument.IntegerParser.class, integerParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); - final boolean hasMin = integerParser.getMin() != Integer.MIN_VALUE; - final boolean hasMax = integerParser.getMax() != Integer.MAX_VALUE; - if (hasMin) { - node.min(integerParser.getMin()); - } - if (hasMax) { - node.max(integerParser.getMax()); - } - return node; - }); - registerMapper(FloatArgument.FloatParser.class, floatParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); - final boolean hasMin = floatParser.getMin() != Float.NEGATIVE_INFINITY; - final boolean hasMax = floatParser.getMax() != Float.POSITIVE_INFINITY; - if (hasMin) { - node.min(floatParser.getMin()); - } - if (hasMax) { - node.max(floatParser.getMax()); - } - return node; - }); - registerMapper(DoubleArgument.DoubleParser.class, doubleParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); - final boolean hasMin = doubleParser.getMin() != Double.NEGATIVE_INFINITY; - final boolean hasMax = doubleParser.getMax() != Double.POSITIVE_INFINITY; - if (hasMin) { - node.min(doubleParser.getMin()); - } - if (hasMax) { - node.max(doubleParser.getMax()); - } - return node; - }); - registerMapper(BooleanArgument.BooleanParser.class, booleanParser -> ClientCompletionKeys.BOOL.get().createNode()); - registerMapper( - FlagArgument.FlagArgumentParser.class, - flagArgumentParser -> ClientCompletionKeys.STRING.get().createNode().greedy() - ); - registerMapper( - StringArrayArgument.StringArrayParser.class, - stringArrayParser -> ClientCompletionKeys.STRING.get().createNode().greedy() - ); - } - - @SuppressWarnings({"unchecked", "rawtypes"}) - private static > void registerMapper( - final @NonNull Class cloudType, - final @NonNull Function> mapper - ) { - MAPPERS.put(cloudType, (Function) mapper); - } - } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java new file mode 100644 index 00000000..c5f554a3 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java @@ -0,0 +1,45 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.arguments.parser.ArgumentParser; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +/** + * An {@link ArgumentParser} which also supplies a special {@link CommandTreeNode.Argument}. + * + * @param sender type + * @param value type + */ +public interface NodeSupplyingArgumentParser extends ArgumentParser { + + /** + * Get the node for this parser. + * + * @return argument node + */ + CommandTreeNode.@NonNull Argument> node(); + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 9fa1bafd..d9f604ee 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -28,11 +28,18 @@ import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; +import cloud.commandframework.sponge.argument.EnchantmentTypeArgument; +import cloud.commandframework.sponge.argument.NamedTextColorArgument; +import cloud.commandframework.sponge.argument.OperatorArgument; import com.google.inject.Inject; import com.google.inject.Module; +import io.leangen.geantyref.TypeToken; +import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.parameter.managed.operator.Operator; +import org.spongepowered.api.item.enchantment.EnchantmentType; import org.spongepowered.plugin.PluginContainer; import java.util.function.Function; @@ -51,14 +58,15 @@ public final class SpongeCommandManager extends CommandManager { private final PluginContainer pluginContainer; private final Function causeMapper; private final Function backwardsCauseMapper; + private final SpongeParserMapper parserMapper; /** * Create a new command manager instance * * @param pluginContainer Owning plugin * @param commandExecutionCoordinator Execution coordinator instance - * @param causeMapper Function mapping the custom command sender type to a Sponge subject - * @param backwardsCauseMapper Function mapping Sponge subjects to the custom command sender type + * @param causeMapper Function mapping the custom command sender type to a Sponge CommandCause + * @param backwardsCauseMapper Function mapping Sponge CommandCause to the custom command sender type */ @SuppressWarnings("unchecked") @Inject @@ -74,6 +82,23 @@ public SpongeCommandManager( this.causeMapper = causeMapper; this.backwardsCauseMapper = backwardsCauseMapper; Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); + this.registerParsers(); + this.parserMapper = new SpongeParserMapper<>(); + } + + private void registerParsers() { + this.getParserRegistry().registerParserSupplier( + TypeToken.get(EnchantmentType.class), + params -> new EnchantmentTypeArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(NamedTextColor.class), + params -> new NamedTextColorArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(Operator.class), + params -> new OperatorArgument.Parser<>() + ); } @Override @@ -98,6 +123,10 @@ public boolean hasPermission( return this.pluginContainer; } + @NonNull SpongeParserMapper parserMapper() { + return this.parserMapper; + } + @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper() { return this.causeMapper; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java new file mode 100644 index 00000000..2282cab8 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -0,0 +1,166 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.compound.FlagArgument; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.standard.BooleanArgument; +import cloud.commandframework.arguments.standard.ByteArgument; +import cloud.commandframework.arguments.standard.DoubleArgument; +import cloud.commandframework.arguments.standard.FloatArgument; +import cloud.commandframework.arguments.standard.IntegerArgument; +import cloud.commandframework.arguments.standard.ShortArgument; +import cloud.commandframework.arguments.standard.StringArgument; +import cloud.commandframework.arguments.standard.StringArrayArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public final class SpongeParserMapper { + + private static final Class DELEGATING_SUGGESTIONS_PROVIDER; // todo - ugly + + static { + try { + DELEGATING_SUGGESTIONS_PROVIDER = Class.forName("cloud.commandframework.arguments.DelegatingSuggestionsProvider"); + } catch (final ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private final Map, Function>>> mappers + = new HashMap<>(); + + SpongeParserMapper() { + this.initStandardMappers(); + } + + @SuppressWarnings("unchecked") + CommandTreeNode> toSponge(final CommandArgument value) { + final CommandTreeNode> result; + final ArgumentParser parser = value.getParser(); + if (parser instanceof NodeSupplyingArgumentParser) { + result = ((NodeSupplyingArgumentParser) parser).node(); + } else { + final Function>> mapper = + this.mappers.get(parser.getClass()); + if (mapper != null) { + result = mapper.apply(parser); + } else { + result = ClientCompletionKeys.STRING.get().createNode().word(); + } + } + final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); + if (customSuggestionsProvider) { + // ignore intellij, it won't compile without this cast + return (CommandTreeNode>) result.customSuggestions(); + } + return result; + } + + private void initStandardMappers() { + this.registerMapper(StringArgument.StringParser.class, stringParser -> { + final StringArgument.StringMode mode = stringParser.getStringMode(); + if (mode == StringArgument.StringMode.SINGLE) { + return ClientCompletionKeys.STRING.get().createNode().word(); + } else if (mode == StringArgument.StringMode.QUOTED) { + return ClientCompletionKeys.STRING.get().createNode(); + } else if (mode == StringArgument.StringMode.GREEDY) { + return ClientCompletionKeys.STRING.get().createNode().greedy(); + } + throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); + }); + this.registerMapper(ByteArgument.ByteParser.class, byteParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + node.min((int) byteParser.getMin()); + node.max((int) byteParser.getMax()); + return node; + }); + this.registerMapper(ShortArgument.ShortParser.class, shortParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + node.min((int) shortParser.getMin()); + node.max((int) shortParser.getMax()); + return node; + }); + this.registerMapper(IntegerArgument.IntegerParser.class, integerParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + final boolean hasMin = integerParser.getMin() != Integer.MIN_VALUE; + final boolean hasMax = integerParser.getMax() != Integer.MAX_VALUE; + if (hasMin) { + node.min(integerParser.getMin()); + } + if (hasMax) { + node.max(integerParser.getMax()); + } + return node; + }); + this.registerMapper(FloatArgument.FloatParser.class, floatParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); + final boolean hasMin = floatParser.getMin() != Float.NEGATIVE_INFINITY; + final boolean hasMax = floatParser.getMax() != Float.POSITIVE_INFINITY; + if (hasMin) { + node.min(floatParser.getMin()); + } + if (hasMax) { + node.max(floatParser.getMax()); + } + return node; + }); + this.registerMapper(DoubleArgument.DoubleParser.class, doubleParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); + final boolean hasMin = doubleParser.getMin() != Double.NEGATIVE_INFINITY; + final boolean hasMax = doubleParser.getMax() != Double.POSITIVE_INFINITY; + if (hasMin) { + node.min(doubleParser.getMin()); + } + if (hasMax) { + node.max(doubleParser.getMax()); + } + return node; + }); + this.registerMapper(BooleanArgument.BooleanParser.class, booleanParser -> ClientCompletionKeys.BOOL.get().createNode()); + this.registerMapper( + FlagArgument.FlagArgumentParser.class, + flagArgumentParser -> ClientCompletionKeys.STRING.get().createNode().greedy() + ); + this.registerMapper( + StringArrayArgument.StringArrayParser.class, + stringArrayParser -> ClientCompletionKeys.STRING.get().createNode().greedy() + ); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private > void registerMapper( + final @NonNull Class cloudType, + final @NonNull Function> mapper + ) { + this.mappers.put(cloudType, (Function) mapper); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java new file mode 100644 index 00000000..9712d784 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java @@ -0,0 +1,137 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.item.enchantment.EnchantmentType; +import org.spongepowered.api.registry.RegistryEntry; +import org.spongepowered.api.registry.RegistryTypes; + +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class EnchantmentTypeArgument extends CommandArgument { + + private EnchantmentTypeArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + EnchantmentType.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull EnchantmentTypeArgument optional(final @NonNull String name) { + return EnchantmentTypeArgument.builder(name).asOptional().build(); + } + + public static @NonNull EnchantmentTypeArgument of(final @NonNull String name) { + return EnchantmentTypeArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull EnchantmentType> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final ResourceKey key = resourceKey(input); + if (key == null) { + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("invalid key!")); + } + final Optional> entry = Sponge.game() + .registries() + .registry(RegistryTypes.ENCHANTMENT_TYPE) + .findEntry(key); + if (entry.isPresent()) { + inputQueue.remove(); + return ArgumentParseResult.success(entry.get().value()); + } + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ITEM_ENCHANTMENT.get().createNode(); + } + + } + + static @Nullable ResourceKey resourceKey(final @NonNull String input) { + try { + return ResourceKey.resolve(input); + } catch (final IllegalStateException ex) { + return null; + } + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(EnchantmentType.class, name); + } + + @Override + public @NonNull EnchantmentTypeArgument build() { + return new EnchantmentTypeArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java new file mode 100644 index 00000000..fa35cfdf --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -0,0 +1,122 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import net.kyori.adventure.text.format.NamedTextColor; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class NamedTextColorArgument extends CommandArgument { + + private NamedTextColorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + NamedTextColor.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull NamedTextColorArgument optional(final @NonNull String name) { + return NamedTextColorArgument.builder(name).asOptional().build(); + } + + public static @NonNull NamedTextColorArgument of(final @NonNull String name) { + return NamedTextColorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull NamedTextColor> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek().toLowerCase(Locale.ROOT); + final Optional color = Sponge.registry() + .adventureRegistry() + .namedColors() + .value(input); + if (color.isPresent()) { + inputQueue.remove(); + return ArgumentParseResult.success(color.get()); + } + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.COLOR.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(NamedTextColor.class, name); + } + + @Override + public @NonNull NamedTextColorArgument build() { + return new NamedTextColorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java new file mode 100644 index 00000000..41c33655 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -0,0 +1,124 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.parameter.managed.operator.Operator; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.registry.RegistryTypes; + +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class OperatorArgument extends CommandArgument { + + private OperatorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + Operator.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull OperatorArgument optional(final @NonNull String name) { + return OperatorArgument.builder(name).asOptional().build(); + } + + public static @NonNull OperatorArgument of(final @NonNull String name) { + return OperatorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull Operator> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final Optional operator = Sponge.game() + .registries() + .registry(RegistryTypes.OPERATOR) + .stream() + .filter(op -> op.asString().equals(input)) + .findFirst(); + if (!operator.isPresent()) { + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + inputQueue.remove(); + return ArgumentParseResult.success(operator.get()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.OPERATION.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(Operator.class, name); + } + + @Override + public @NonNull OperatorArgument build() { + return new OperatorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java new file mode 100644 index 00000000..64b8726a --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java @@ -0,0 +1,27 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +/** + * Arguments for the Sponge API v8 environment + */ +package cloud.commandframework.sponge.argument; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java index 6fbb8025..ab1a0196 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java @@ -21,7 +21,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - /** * Cloud for Sponge API v8 */ diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts new file mode 100644 index 00000000..e1cf5397 --- /dev/null +++ b/examples/example-sponge/build.gradle.kts @@ -0,0 +1,34 @@ +import org.spongepowered.gradle.plugin.config.PluginLoaders +import org.spongepowered.plugin.metadata.PluginDependency + +plugins { + id("org.spongepowered.gradle.plugin") version "1.0.3" + id("com.github.johnrengelman.shadow") +} + +dependencies { + implementation(project(":cloud-sponge")) + implementation(project(":cloud-minecraft-extras")) +} + +sponge { + apiVersion("8.0.0") + plugin("cloud-example-sponge") { + loader(PluginLoaders.JAVA_PLAIN) + displayName("Cloud example Sponge plugin") + mainClass("cloud.commandframework.examples.sponge.CloudExamplePlugin") + dependency("spongeapi") { + loadOrder(PluginDependency.LoadOrder.AFTER) + optional(false) + } + } +} + +tasks { + runServer { + classpath(shadowJar) + } + build { + dependsOn(shadowJar) + } +} diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java new file mode 100644 index 00000000..a31821d0 --- /dev/null +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -0,0 +1,197 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.examples.sponge; + +import cloud.commandframework.Command; +import cloud.commandframework.arguments.standard.DoubleArgument; +import cloud.commandframework.arguments.standard.IntegerArgument; +import cloud.commandframework.arguments.standard.StringArgument; +import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.sponge.CloudInjectionModule; +import cloud.commandframework.sponge.SpongeCommandManager; +import cloud.commandframework.sponge.argument.EnchantmentTypeArgument; +import cloud.commandframework.sponge.argument.NamedTextColorArgument; +import cloud.commandframework.sponge.argument.OperatorArgument; +import com.google.common.collect.ImmutableList; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.TypeLiteral; +import net.kyori.adventure.text.format.NamedTextColor; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.parameter.managed.operator.Operator; +import org.spongepowered.api.command.parameter.managed.operator.Operators; +import org.spongepowered.api.data.Keys; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.enchantment.Enchantment; +import org.spongepowered.api.item.enchantment.EnchantmentType; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.Slot; +import org.spongepowered.api.item.inventory.entity.Hotbar; +import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; +import org.spongepowered.api.service.permission.Subject; +import org.spongepowered.plugin.jvm.Plugin; + +import static net.kyori.adventure.text.Component.space; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.AQUA; +import static net.kyori.adventure.text.format.NamedTextColor.BLUE; +import static net.kyori.adventure.text.format.NamedTextColor.RED; + +@Plugin("cloud-example-sponge") +public final class CloudExamplePlugin { + + private final SpongeCommandManager commandManager; + + @Inject + public CloudExamplePlugin(final @NonNull Injector injector) { + final Injector childInjector = injector.createChildInjector( + CloudInjectionModule.createNative(CommandExecutionCoordinator.simpleCoordinator()) + ); + this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral>() { + })); + this.registerCommands(); + } + + private void registerCommands() { + this.commandManager.command(this.commandManager.commandBuilder("cloud_test") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(this.commandManager.commandBuilder("cloud_test1") + .literal("test") + .literal("test1") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + final Command.Builder cloud_test2 = this.commandManager.commandBuilder("cloud_test2"); + this.commandManager.command(cloud_test2.literal("test") + .argument(StringArgument.single("string_arg")) + .literal("test2") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(cloud_test2.literal("test") + .literal("literal_arg") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(cloud_test2.literal("another_test") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(this.commandManager.commandBuilder("string_test") + .argument(StringArgument.single("single")) + .argument(StringArgument.quoted("quoted")) + .argument(StringArgument.greedy("greedy")) + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(this.commandManager.commandBuilder("int_test") + .argument(IntegerArgument.of("any")) + .argument(IntegerArgument.newBuilder("gt0").withMin(1)) + .argument(IntegerArgument.newBuilder("lt100").withMax(99)) + .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(this.commandManager.commandBuilder("enchantment_type_test") + .argument(EnchantmentTypeArgument.of("enchantment_type")) + .argument(IntegerArgument.optional("level", 1)) + .handler(ctx -> { + final Subject subject = ctx.getSender().subject(); + if (!(subject instanceof Player)) { + ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); + return; + } + final Player player = (Player) subject; + final Hotbar hotbar = player.inventory().hotbar(); + final int index = hotbar.selectedSlotIndex(); + final Slot slot = hotbar.slot(index).get(); + final InventoryTransactionResult.Poll result = slot.poll(); + if (result.type() != InventoryTransactionResult.Type.SUCCESS) { + player.sendMessage(text("You must hold an item to enchant!", RED)); + return; + } + final ItemStack modified = ItemStack.builder() + .fromItemStack(result.polledItem().createStack()) + .add(Keys.APPLIED_ENCHANTMENTS, ImmutableList.of( + Enchantment.of( + ctx.get("enchantment_type"), + ctx.get("level") + ) + )) + .build(); + slot.set(modified); + })); + this.commandManager.command(this.commandManager.commandBuilder("color_test") + .argument(NamedTextColorArgument.of("color")) + .argument(StringArgument.greedy("message")) + .handler(ctx -> { + ctx.getSender().audience().sendMessage( + text(ctx.get("message"), ctx.get("color")) + ); + })); + this.commandManager.command(this.commandManager.commandBuilder("operator_test") + .argument(IntegerArgument.of("first")) + .argument(OperatorArgument.of("operator")) + .argument(IntegerArgument.of("second")) + .handler(ctx -> { + final int first = ctx.get("first"); + final int second = ctx.get("second"); + final Operator operator = ctx.get("operator"); + if (!(operator instanceof Operator.Simple)) { + ctx.getSender().audience().sendMessage( + text("That type of operator is not applicable here!", RED) + ); + return; + } + ctx.getSender().audience().sendMessage(text() + .color(AQUA) + .append(text(first)) + .append(space()) + .append(text(operator.asString(), BLUE)) + .append(space()) + .append(text(second)) + .append(space()) + .append(text('→', BLUE)) + .append(space()) + .append(text(((Operator.Simple) operator).apply(first, second))) + ); + })); + this.commandManager.command(this.commandManager.commandBuilder("modifylevel") + .argument(OperatorArgument.of("operator")) + .argument(DoubleArgument.of("value")) + .handler(ctx -> { + final Subject subject = ctx.getSender().subject(); + if (!(subject instanceof Player)) { + ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); + return; + } + final Player player = (Player) subject; + final Operator operator = ctx.get("operator"); + final double value = ctx.get("value"); + if (operator == Operators.ASSIGN.get()) { + player.offer(Keys.EXPERIENCE, (int) value); + return; + } + if (!(operator instanceof Operator.Simple)) { + ctx.getSender().audience().sendMessage( + text("That type of operator is not applicable here!", RED) + ); + return; + } + final int currentXp = player.get(Keys.EXPERIENCE).get(); + player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); + })); + } + +} From a58783478e6ce839255f362e3e09c60f0b38de09 Mon Sep 17 00:00:00 2001 From: jmp Date: Sat, 24 Apr 2021 14:42:06 -0700 Subject: [PATCH 09/72] sponge: More work on Sponge API 8 implementation --- .../sponge/CloudSpongeCommand.java | 143 +++++---- .../sponge/SpongeCommandContextKeys.java | 48 +++ .../sponge/SpongeCommandManager.java | 114 ++++++- .../sponge/SpongeCommandPreprocessor.java | 57 ++++ .../sponge/SpongeParserMapper.java | 221 ++++++++++--- .../sponge/SpongeRegistrationHandler.java | 35 +- .../MultipleEntitySelectorArgument.java | 164 ++++++++++ .../MultiplePlayerSelectorArgument.java | 169 ++++++++++ .../sponge/argument/OperatorArgument.java | 6 +- .../argument/RegistryEntryArgument.java | 303 ++++++++++++++++++ .../SingleEntitySelectorArgument.java | 166 ++++++++++ .../SinglePlayerSelectorArgument.java | 169 ++++++++++ ...ntTypeArgument.java => WorldArgument.java} | 64 ++-- .../sponge/data/MultipleEntitySelector.java | 34 ++ .../sponge/data/MultiplePlayerSelector.java | 33 ++ .../sponge/data/SelectorWrapper.java | 85 +++++ .../sponge/data/SingleEntitySelector.java | 34 ++ .../sponge/data/SinglePlayerSelector.java | 34 ++ .../sponge/data/package-info.java | 27 ++ .../examples/sponge/CloudExamplePlugin.java | 106 +++++- .../examples/sponge/package-info.java | 27 ++ 21 files changed, 1858 insertions(+), 181 deletions(-) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/{EnchantmentTypeArgument.java => WorldArgument.java} (63%) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java create mode 100644 examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index fccb6c2e..47f677d0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -43,6 +43,7 @@ import org.spongepowered.api.command.parameter.ArgumentReader; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletionException; @@ -76,13 +77,7 @@ final class CloudSpongeCommand implements Command.Raw { public CommandResult process(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { final C cloudSender = this.commandManager.backwardsCauseMapper().apply(cause); final Audience audience = cause.audience(); - final String args = arguments.input(); - final String input; - if (args.isEmpty()) { - input = this.label; - } else { - input = this.label + " " + args; - } + final String input = this.formatCommand(arguments.input()); this.commandManager.executeCommand(cloudSender, input).whenComplete((result, throwable) -> { if (throwable == null) { return; @@ -90,64 +85,71 @@ public CommandResult process(final @NonNull CommandCause cause, final ArgumentRe if (throwable instanceof CompletionException) { throwable = throwable.getCause(); } - final Throwable finalThrowable = throwable; - if (throwable instanceof InvalidSyntaxException) { - this.commandManager.handleException(cloudSender, - InvalidSyntaxException.class, - (InvalidSyntaxException) throwable, (c, e) -> audience.sendMessage(TextComponent.ofChildren( - text("Invalid Command Syntax. Correct command syntax is: ", RED), - text("/" + ((InvalidSyntaxException) finalThrowable).getCorrectSyntax(), GRAY) - )) - ); - } else if (throwable instanceof InvalidCommandSenderException) { - this.commandManager.handleException(cloudSender, - InvalidCommandSenderException.class, - (InvalidCommandSenderException) throwable, (c, e) -> - audience.sendMessage(text(finalThrowable.getMessage(), RED)) - ); - } else if (throwable instanceof NoPermissionException) { - this.commandManager.handleException(cloudSender, - NoPermissionException.class, - (NoPermissionException) throwable, (c, e) -> - audience.sendMessage(MESSAGE_NO_PERMS) - ); - } else if (throwable instanceof NoSuchCommandException) { - this.commandManager.handleException(cloudSender, - NoSuchCommandException.class, - (NoSuchCommandException) throwable, (c, e) -> - audience.sendMessage(MESSAGE_UNKNOWN_COMMAND) - ); - } else if (throwable instanceof ArgumentParseException) { - this.commandManager.handleException(cloudSender, - ArgumentParseException.class, - (ArgumentParseException) throwable, (c, e) -> - audience.sendMessage(TextComponent.ofChildren( - text("Invalid Command Argument: ", RED), - getMessage(finalThrowable.getCause()).colorIfAbsent(GRAY) - )) - ); - } else if (throwable instanceof CommandExecutionException) { - this.commandManager.handleException(cloudSender, - CommandExecutionException.class, - (CommandExecutionException) throwable, (c, e) -> { - audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.getOwningPlugin().getLogger().error( - "Exception executing command handler", - finalThrowable.getCause() - ); - } - ); - } else { - audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.getOwningPlugin().getLogger().error( - "An unhandled exception was thrown during command execution", - throwable - ); - } + this.handleCommandException(cloudSender, audience, throwable); }); return CommandResult.success(); } + private void handleCommandException(final C cloudSender, final Audience audience, final Throwable throwable) { + if (throwable instanceof InvalidSyntaxException) { + this.commandManager.handleException( + cloudSender, + InvalidSyntaxException.class, + (InvalidSyntaxException) throwable, + (c, e) -> audience.sendMessage(TextComponent.ofChildren( + text("Invalid Command Syntax. Correct command syntax is: ", RED), + text("/" + e.getCorrectSyntax(), GRAY) + )) + ); + } else if (throwable instanceof InvalidCommandSenderException) { + this.commandManager.handleException( + cloudSender, + InvalidCommandSenderException.class, + (InvalidCommandSenderException) throwable, + (c, e) -> audience.sendMessage(text(throwable.getMessage(), RED)) + ); + } else if (throwable instanceof NoPermissionException) { + this.commandManager.handleException( + cloudSender, + NoPermissionException.class, + (NoPermissionException) throwable, + (c, e) -> audience.sendMessage(MESSAGE_NO_PERMS) + ); + } else if (throwable instanceof NoSuchCommandException) { + this.commandManager.handleException( + cloudSender, + NoSuchCommandException.class, + (NoSuchCommandException) throwable, + (c, e) -> audience.sendMessage(MESSAGE_UNKNOWN_COMMAND) + ); + } else if (throwable instanceof ArgumentParseException) { + this.commandManager.handleException( + cloudSender, + ArgumentParseException.class, + (ArgumentParseException) throwable, + (c, e) -> audience.sendMessage(TextComponent.ofChildren( + text("Invalid Command Argument: ", RED), + getMessage(throwable.getCause()).colorIfAbsent(GRAY) + )) + ); + } else if (throwable instanceof CommandExecutionException) { + this.commandManager.handleException( + cloudSender, + CommandExecutionException.class, + (CommandExecutionException) throwable, + (c, e) -> { + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + this.commandManager.owningPluginContainer().getLogger() + .error("Exception executing command handler", throwable.getCause()); + } + ); + } else { + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + this.commandManager.owningPluginContainer().getLogger() + .error("An unhandled exception was thrown during command execution", throwable); + } + } + private static Component getMessage(final Throwable throwable) { final Component msg = ComponentMessageThrowable.getOrConvertMessage(throwable); return msg == null ? NULL : msg; @@ -157,33 +159,40 @@ private static Component getMessage(final Throwable throwable) { public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { return this.commandManager.suggest( this.commandManager.backwardsCauseMapper().apply(cause), - this.label + " " + arguments.input() + this.formatCommand(arguments.input()) ); } @Override public boolean canExecute(final @NonNull CommandCause cause) { + // todo: check if there are any nodes we can execute return true; } @Override public Optional shortDescription(final CommandCause cause) { + // todo return Optional.of(text("short desc!")); } @Override public Optional extendedDescription(final CommandCause cause) { + // todo return Optional.of(text("long desc!")); } @Override public Optional help(final @NonNull CommandCause cause) { + // todo return Raw.super.help(cause); } @Override public Component usage(final CommandCause cause) { - return text("usage!"); + return text(this.commandManager.getCommandSyntaxFormatter().apply( + Collections.emptyList(), + this.commandManager.getCommandTree().getNamedNode(this.label) + )); } @Override @@ -213,4 +222,12 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node COMMAND_CAUSE_KEY = SimpleCloudKey.of( + "cloud:sponge_command_cause", + TypeToken.get(CommandCause.class) + ); + + private SpongeCommandContextKeys() { + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index d9f604ee..c3e8444d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -28,9 +28,19 @@ import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; -import cloud.commandframework.sponge.argument.EnchantmentTypeArgument; +import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; +import cloud.commandframework.sponge.argument.MultiplePlayerSelectorArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; +import cloud.commandframework.sponge.argument.RegistryEntryArgument; +import cloud.commandframework.sponge.argument.SingleEntitySelectorArgument; +import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; +import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.MultipleEntitySelector; +import cloud.commandframework.sponge.data.MultiplePlayerSelector; +import cloud.commandframework.sponge.data.SingleEntitySelector; +import cloud.commandframework.sponge.data.SinglePlayerSelector; +import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Module; import io.leangen.geantyref.TypeToken; @@ -39,9 +49,16 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; -import org.spongepowered.api.item.enchantment.EnchantmentType; +import org.spongepowered.api.registry.DefaultedRegistryType; +import org.spongepowered.api.registry.RegistryType; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.plugin.PluginContainer; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Set; import java.util.function.Function; /** @@ -78,19 +95,16 @@ public SpongeCommandManager( ) { super(commandExecutionCoordinator, new SpongeRegistrationHandler()); this.pluginContainer = pluginContainer; - ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this, Sponge.systemSubject()); + ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this); this.causeMapper = causeMapper; this.backwardsCauseMapper = backwardsCauseMapper; - Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); - this.registerParsers(); this.parserMapper = new SpongeParserMapper<>(); + this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); + this.registerParsers(); + Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); } private void registerParsers() { - this.getParserRegistry().registerParserSupplier( - TypeToken.get(EnchantmentType.class), - params -> new EnchantmentTypeArgument.Parser<>() - ); this.getParserRegistry().registerParserSupplier( TypeToken.get(NamedTextColor.class), params -> new NamedTextColorArgument.Parser<>() @@ -99,6 +113,59 @@ private void registerParsers() { TypeToken.get(Operator.class), params -> new OperatorArgument.Parser<>() ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(ServerWorld.class), + params -> new WorldArgument.Parser<>() + ); + + // Entity selectors + this.getParserRegistry().registerParserSupplier( + TypeToken.get(SinglePlayerSelector.class), + params -> new SinglePlayerSelectorArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(MultiplePlayerSelector.class), + params -> new MultiplePlayerSelectorArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(SingleEntitySelector.class), + params -> new SingleEntitySelectorArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(MultipleEntitySelector.class), + params -> new MultipleEntitySelectorArgument.Parser<>() + ); + + this.registerRegistryParsers(); + } + + private void registerRegistryParsers() { + final Set> ignoredRegistryTypes = ImmutableSet.of( + RegistryTypes.OPERATOR // We have a different Operator parser that doesn't use a ResourceKey as input + ); + for (final Field field : RegistryTypes.class.getDeclaredFields()) { + final Type generic = field.getGenericType(); /* RegistryType */ + if (!(generic instanceof ParameterizedType)) { + continue; + } + + final RegistryType key; + try { + key = (RegistryType) field.get(null); + } catch (final IllegalAccessException ex) { + throw new RuntimeException("Failed to access RegistryTypes." + field.getName(), ex); + } + if (ignoredRegistryTypes.contains(key) || !(key instanceof DefaultedRegistryType)) { + continue; + } + final DefaultedRegistryType registryType = (DefaultedRegistryType) key; + final Type valueType = ((ParameterizedType) generic).getActualTypeArguments()[0]; + + this.getParserRegistry().registerParserSupplier( + TypeToken.get(valueType), + params -> new RegistryEntryArgument.Parser<>(registryType) + ); + } } @Override @@ -115,23 +182,40 @@ public boolean hasPermission( } /** - * Get the plugin that owns this command manager instance + * Get the {@link PluginContainer} of the plugin that owns this command manager. * - * @return Owning plugin + * @return plugin container */ - public @NonNull PluginContainer getOwningPlugin() { + public @NonNull PluginContainer owningPluginContainer() { return this.pluginContainer; } - @NonNull SpongeParserMapper parserMapper() { + /** + * Get the {@link SpongeParserMapper}, responsible for mapping Cloud + * {@link cloud.commandframework.arguments.CommandArgument CommandArguments} to Sponge + * {@link org.spongepowered.api.command.registrar.tree.CommandTreeNode.Argument CommandTreeNode.Arguments}. + * + * @return the parser mapper + */ + public @NonNull SpongeParserMapper parserMapper() { return this.parserMapper; } - @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper() { + /** + * Get the {@link Function} used to map {@link C command senders} to {@link CommandCause CommandCauses}. + * + * @return command cause mapper + */ + public @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper() { return this.causeMapper; } - @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper() { + /** + * Get the {@link Function} used to map {@link CommandCause CommandCauses} to {@link C command senders}. + * + * @return backwards command cause mapper + */ + public @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper() { return this.backwardsCauseMapper; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java new file mode 100644 index 00000000..e20dc2dd --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -0,0 +1,57 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; +import cloud.commandframework.execution.preprocessor.CommandPreprocessor; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Command preprocessor which decorates incoming {@link cloud.commandframework.context.CommandContext} + * with Sponge specific objects + * + * @param Command sender type + */ +final class SpongeCommandPreprocessor implements CommandPreprocessor { + + private final SpongeCommandManager commandManager; + + /** + * The Sponge Command Preprocessor for storing Sponge-specific contexts in the command contexts + * + * @param commandManager command manager + */ + SpongeCommandPreprocessor(final @NonNull SpongeCommandManager commandManager) { + this.commandManager = commandManager; + } + + @Override + public void accept(final @NonNull CommandPreprocessingContext context) { + context.getCommandContext().store( + SpongeCommandContextKeys.COMMAND_CAUSE_KEY, + this.commandManager.causeMapper().apply(context.getCommandContext().getSender()) + ); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 2282cab8..49897340 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -34,14 +34,25 @@ import cloud.commandframework.arguments.standard.ShortArgument; import cloud.commandframework.arguments.standard.StringArgument; import cloud.commandframework.arguments.standard.StringArrayArgument; +import io.leangen.geantyref.GenericTypeReflector; +import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Function; +import static java.util.Objects.requireNonNull; + +/** + * Class responsible for mapping Cloud {@link ArgumentParser ArgumentParsers} to Sponge + * {@link CommandTreeNode.Argument CommandTreeNode.Arguments}. + * + * @param sender type + */ public final class SpongeParserMapper { private static final Class DELEGATING_SUGGESTIONS_PROVIDER; // todo - ugly @@ -54,38 +65,42 @@ public final class SpongeParserMapper { } } - private final Map, Function>>> mappers - = new HashMap<>(); + private final Map, Mapping> mappers = new HashMap<>(); SpongeParserMapper() { this.initStandardMappers(); } - @SuppressWarnings("unchecked") - CommandTreeNode> toSponge(final CommandArgument value) { - final CommandTreeNode> result; + @SuppressWarnings({"unchecked", "rawtypes"}) + CommandTreeNode.Argument> toSponge(final CommandArgument value) { + final CommandTreeNode.Argument> result; final ArgumentParser parser = value.getParser(); if (parser instanceof NodeSupplyingArgumentParser) { result = ((NodeSupplyingArgumentParser) parser).node(); } else { - final Function>> mapper = - this.mappers.get(parser.getClass()); + final Mapping mapper = this.mappers.get(parser.getClass()); if (mapper != null) { - result = mapper.apply(parser); + final CommandTreeNode.Argument> apply = + (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); + if (mapper.cloudSuggestions) { + apply.customSuggestions(); + return apply; + } + result = apply; } else { result = ClientCompletionKeys.STRING.get().createNode().word(); } } final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); if (customSuggestionsProvider) { - // ignore intellij, it won't compile without this cast - return (CommandTreeNode>) result.customSuggestions(); + result.customSuggestions(); } return result; } private void initStandardMappers() { - this.registerMapper(StringArgument.StringParser.class, stringParser -> { + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(stringParser -> { final StringArgument.StringMode mode = stringParser.getStringMode(); if (mode == StringArgument.StringMode.SINGLE) { return ClientCompletionKeys.STRING.get().createNode().word(); @@ -95,20 +110,23 @@ private void initStandardMappers() { return ClientCompletionKeys.STRING.get().createNode().greedy(); } throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); - }); - this.registerMapper(ByteArgument.ByteParser.class, byteParser -> { + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(byteParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); node.min((int) byteParser.getMin()); node.max((int) byteParser.getMax()); return node; - }); - this.registerMapper(ShortArgument.ShortParser.class, shortParser -> { + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(shortParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); node.min((int) shortParser.getMin()); node.max((int) shortParser.getMax()); return node; - }); - this.registerMapper(IntegerArgument.IntegerParser.class, integerParser -> { + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(integerParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); final boolean hasMin = integerParser.getMin() != Integer.MIN_VALUE; final boolean hasMax = integerParser.getMax() != Integer.MAX_VALUE; @@ -119,8 +137,9 @@ private void initStandardMappers() { node.max(integerParser.getMax()); } return node; - }); - this.registerMapper(FloatArgument.FloatParser.class, floatParser -> { + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(floatParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); final boolean hasMin = floatParser.getMin() != Float.NEGATIVE_INFINITY; final boolean hasMax = floatParser.getMax() != Float.POSITIVE_INFINITY; @@ -131,8 +150,9 @@ private void initStandardMappers() { node.max(floatParser.getMax()); } return node; - }); - this.registerMapper(DoubleArgument.DoubleParser.class, doubleParser -> { + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(doubleParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); final boolean hasMin = doubleParser.getMin() != Double.NEGATIVE_INFINITY; final boolean hasMax = doubleParser.getMax() != Double.POSITIVE_INFINITY; @@ -143,24 +163,153 @@ private void initStandardMappers() { node.max(doubleParser.getMax()); } return node; - }); - this.registerMapper(BooleanArgument.BooleanParser.class, booleanParser -> ClientCompletionKeys.BOOL.get().createNode()); - this.registerMapper( - FlagArgument.FlagArgumentParser.class, - flagArgumentParser -> ClientCompletionKeys.STRING.get().createNode().greedy() - ); - this.registerMapper( - StringArrayArgument.StringArrayParser.class, - stringArrayParser -> ClientCompletionKeys.STRING.get().createNode().greedy() - ); + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(booleanParser -> { + return ClientCompletionKeys.BOOL.get().createNode(); + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(flagArgumentParser -> { + return ClientCompletionKeys.STRING.get().createNode().greedy(); + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(stringArrayParser -> { + return ClientCompletionKeys.STRING.get().createNode().greedy(); + })); } - @SuppressWarnings({"unchecked", "rawtypes"}) - private > void registerMapper( - final @NonNull Class cloudType, - final @NonNull Function> mapper + /** + * Register a mapping from a Cloud {@link ArgumentParser} type to a Sponge {@link CommandTreeNode.Argument}. This will + * replace any existing mapping. + * + * @param cloudType cloud argument parser type + * @param configurer builder configurer + * @param argument value type + * @param cloud argument parser type + */ + public > void registerMapping( + final @NonNull TypeToken cloudType, + final @NonNull Consumer> configurer ) { - this.mappers.put(cloudType, (Function) mapper); + final MappingBuilderImpl builder = new MappingBuilderImpl<>(); + configurer.accept(builder); + this.mappers.put(GenericTypeReflector.erase(cloudType.getType()), builder.build()); + } + + /** + * Set whether to use Cloud suggestions, or to fall back on the suggestions provided + * by the {@link CommandTreeNode.Argument} for an already registered mapping. This is effectively {@code false} by default. + * + * @param parserType cloud argument parser type + * @param cloudSuggestions Whether or not Cloud suggestions should be used + * @param argument value type + * @param cloud argument parser type + * @throws IllegalArgumentException when there is no mapper registered for the provided argument type + */ + public > void cloudSuggestions( + final @NonNull TypeToken parserType, + final boolean cloudSuggestions + ) throws IllegalArgumentException { + final Mapping mapping = this.mappers.get(GenericTypeReflector.erase(parserType.getType())); + if (mapping == null) { + throw new IllegalArgumentException( + "No mapper registered for type: " + GenericTypeReflector + .erase(parserType.getType()) + .toGenericString() + ); + } + this.mappers.put( + GenericTypeReflector.erase(parserType.getType()), + new Mapping<>(mapping.mapper, cloudSuggestions) + ); + } + + /** + * Set whether to use Cloud's custom suggestions for number argument types. If {@code false}, the default Brigadier number + * completions will be used. + * + * @param cloudNumberSuggestions whether to use Cloud number suggestions + */ + public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); + } + + /** + * Builder for mappings from Cloud {@link ArgumentParser ArgumentParsers} to Sponge + * {@link CommandTreeNode.Argument CommandTreeNode.Arguments} + * + * @param sender type + * @param parser type + */ + public interface MappingBuilder> { + + /** + * Set whether to use cloud suggestions, or to fall back onto {@link ClientCompletionKeys}. By default, this is set to + * {@code false}. + * + * @param cloudSuggestions whether to use cloud suggestions + * @return this builder + */ + @NonNull MappingBuilder cloudSuggestions(boolean cloudSuggestions); + + /** + * Set the mapper function from {@link A} to {@link CommandTreeNode.Argument}. + * + * @param mapper mapper function + * @return this builder + */ + @NonNull MappingBuilder to(@NonNull Function>> mapper); + + } + + private static final class MappingBuilderImpl> implements MappingBuilder { + + private Function>> mapper; + private boolean cloudSuggestions; + + @Override + public @NonNull MappingBuilder cloudSuggestions(final boolean cloudSuggestions) { + this.cloudSuggestions = cloudSuggestions; + return this; + } + + @Override + public @NonNull MappingBuilder to( + final @NonNull Function>> mapper + ) { + this.mapper = mapper; + return this; + } + + private SpongeParserMapper.@NonNull Mapping build() { + requireNonNull(this.mapper, "Must provide a mapper function!"); + return new Mapping<>(this.mapper, this.cloudSuggestions); + } + + } + + private static final class Mapping> { + + private final Function>> mapper; + private final boolean cloudSuggestions; + + private Mapping( + final Function>> mapper, + final boolean cloudSuggestions + ) { + this.mapper = mapper; + this.cloudSuggestions = cloudSuggestions; + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 9c88a653..77848ef6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -23,20 +23,20 @@ // package cloud.commandframework.sponge; +import cloud.commandframework.CommandTree; +import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.StaticArgument; import cloud.commandframework.internal.CommandRegistrationHandler; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; -import org.spongepowered.api.SystemSubject; import org.spongepowered.api.command.Command; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; import java.util.HashSet; -import java.util.List; import java.util.Set; -import static java.util.stream.Collectors.groupingBy; +import static java.util.Objects.requireNonNull; final class SpongeRegistrationHandler implements CommandRegistrationHandler { @@ -46,36 +46,31 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { SpongeRegistrationHandler() { } + @SuppressWarnings("unchecked") //@Listener public void handleRegistrationEvent(final RegisterCommandEvent event) { this.commandManager.registrationCalled(); - this.registeredCommands.stream() - .collect(groupingBy(command -> command.getArguments().get(0).getName())) - .forEach((label, commands) -> - this.registerCommand(event, label, commands)); + for (final CommandTree.Node> node : this.commandManager.getCommandTree().getRootNodes()) { + final StaticArgument value = requireNonNull((StaticArgument) node.getValue()); + this.registerCommand(event, value); + } } - @SuppressWarnings("unchecked") - private void registerCommand( - final RegisterCommandEvent event, - final String label, - final List> commands - ) { + private void registerCommand(final RegisterCommandEvent event, final StaticArgument rootLiteral) { + final String label = rootLiteral.getName(); event.register( - this.commandManager.getOwningPlugin(), + this.commandManager.owningPluginContainer(), new CloudSpongeCommand<>(label, this.commandManager), label, - ((StaticArgument) commands.get(0).getArguments().get(0)).getAlternativeAliases().toArray(new String[0]) + rootLiteral.getAlternativeAliases().toArray(new String[0]) ); } - void initialize( - final @NonNull SpongeCommandManager commandManager, - final @NonNull SystemSubject subject - ) { + void initialize(final @NonNull SpongeCommandManager commandManager) { this.commandManager = commandManager; + // todo: https://github.com/SpongePowered/Sponge/issues/3367 Sponge.eventManager().registerListener( - this.commandManager.getOwningPlugin(), + this.commandManager.owningPluginContainer(), new TypeToken>() { }, this::handleRegistrationEvent diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java new file mode 100644 index 00000000..421e9e27 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -0,0 +1,164 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.MultipleEntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.Entity; + +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class MultipleEntitySelectorArgument extends CommandArgument { + + private MultipleEntitySelectorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + MultipleEntitySelector.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull MultipleEntitySelectorArgument optional(final @NonNull String name) { + return MultipleEntitySelectorArgument.builder(name).asOptional().build(); + } + + public static @NonNull MultipleEntitySelectorArgument of(final @NonNull String name) { + return MultipleEntitySelectorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull MultipleEntitySelector> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final Selector selector; + try { + selector = Selector.parse(input); + } catch (final IllegalArgumentException ex) { + return ArgumentParseResult.failure(ex); // todo + } + final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); + final Collection result = selector.select(cause); + if (result.isEmpty()) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + inputQueue.remove(); + return ArgumentParseResult.success(new MultipleEntitySelectorImpl( + selector, + input, + result + )); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ENTITY.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(MultipleEntitySelector.class, name); + } + + @Override + public @NonNull MultipleEntitySelectorArgument build() { + return new MultipleEntitySelectorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + + private static final class MultipleEntitySelectorImpl implements MultipleEntitySelector { + + private final Selector selector; + private final String inputString; + private final Collection result; + + private MultipleEntitySelectorImpl( + final Selector selector, + final String inputString, + final Collection result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Collection get() { + return this.result; + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java new file mode 100644 index 00000000..78244652 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -0,0 +1,169 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.MultiplePlayerSelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.living.player.Player; + +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; + +public final class MultiplePlayerSelectorArgument extends CommandArgument { + + private MultiplePlayerSelectorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + MultiplePlayerSelector.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull MultiplePlayerSelectorArgument optional(final @NonNull String name) { + return MultiplePlayerSelectorArgument.builder(name).asOptional().build(); + } + + public static @NonNull MultiplePlayerSelectorArgument of(final @NonNull String name) { + return MultiplePlayerSelectorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull MultiplePlayerSelector> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final Selector selector; + try { + selector = Selector.parse(input); + } catch (final IllegalArgumentException ex) { + return ArgumentParseResult.failure(ex); // todo + } + if (!selector.playersOnly()) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); // todo + } + final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); + final Collection result = selector.select(cause).stream() + .map(e -> (Player) e).collect(Collectors.toList()); + if (result.isEmpty()) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + inputQueue.remove(); + return ArgumentParseResult.success(new MultiplePlayerSelectorImpl( + selector, + input, + result + )); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ENTITY.get().createNode().playersOnly(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(MultiplePlayerSelector.class, name); + } + + @Override + public @NonNull MultiplePlayerSelectorArgument build() { + return new MultiplePlayerSelectorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + + private static final class MultiplePlayerSelectorImpl implements MultiplePlayerSelector { + + private final Selector selector; + private final String inputString; + private final Collection result; + + private MultiplePlayerSelectorImpl( + final Selector selector, + final String inputString, + final Collection result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Collection get() { + return this.result; + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 41c33655..67e42388 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -30,7 +30,6 @@ import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.Sponge; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; @@ -81,10 +80,7 @@ public static final class Parser implements NodeSupplyingArgumentParser inputQueue ) { final String input = inputQueue.peek(); - final Optional operator = Sponge.game() - .registries() - .registry(RegistryTypes.OPERATOR) - .stream() + final Optional operator = RegistryTypes.OPERATOR.get().stream() .filter(op -> op.asString().equals(input)) .findFirst(); if (!operator.isPresent()) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java new file mode 100644 index 00000000..d642b1df --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -0,0 +1,303 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import io.leangen.geantyref.TypeToken; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.ClientSuggestionProviders; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.registry.DefaultedRegistryType; +import org.spongepowered.api.registry.Registry; +import org.spongepowered.api.registry.RegistryEntry; +import org.spongepowered.api.registry.RegistryHolder; +import org.spongepowered.api.registry.RegistryType; +import org.spongepowered.api.registry.RegistryTypes; + +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +public final class RegistryEntryArgument extends CommandArgument { // todo: should we return a RegistryEntry? + + private RegistryEntryArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(holderSupplier, registryType), + defaultValue, + valueType, + suggestionsProvider, + defaultDescription + ); + } + + // Start DefaultedRegistryType methods + + public static @NonNull RegistryEntryArgument of( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return RegistryEntryArgument.builder(name, valueType, registryType).build(); + } + + public static @NonNull RegistryEntryArgument of( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return of(name, TypeToken.get(valueType), registryType); + } + + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return RegistryEntryArgument.builder(name, valueType, registryType).asOptional().build(); + } + + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return optional(name, TypeToken.get(valueType), registryType); + } + + public static @NonNull Builder builder( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return new Builder<>(name, valueType, ctx -> registryType.defaultHolder().get(), registryType); + } + + public static @NonNull Builder builder( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return builder(name, TypeToken.get(valueType), registryType); + } + + // End DefaultedRegistryType methods + + // Start RegistryType methods + + public static @NonNull RegistryEntryArgument of( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return RegistryEntryArgument.builder(name, valueType, holderSupplier, registryType).build(); + } + + public static @NonNull RegistryEntryArgument of( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return of(name, TypeToken.get(valueType), holderSupplier, registryType); + } + + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return builder(name, valueType, holderSupplier, registryType).asOptional().build(); + } + + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return optional(name, TypeToken.get(valueType), holderSupplier, registryType); + } + + public static @NonNull Builder builder( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return new Builder<>(name, valueType, holderSupplier, registryType); + } + + public static @NonNull Builder builder( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + return builder(name, TypeToken.get(valueType), holderSupplier, registryType); + } + + // End RegistryType methods + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final Function, RegistryHolder> holderSupplier; + private final RegistryType registryType; + + public Parser( + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + this.holderSupplier = holderSupplier; + this.registryType = registryType; + } + + public Parser(final @NonNull DefaultedRegistryType registryType) { + this(ctx -> registryType.defaultHolder().get(), registryType); + } + + private Registry registry(final @NonNull CommandContext commandContext) { + return this.holderSupplier.apply(commandContext).registry(this.registryType); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull V> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final ResourceKey key = resourceKey(input); + if (key == null) { + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("invalid key!")); + } + final Optional> entry = this.registry(commandContext).findEntry(key); + if (entry.isPresent()) { + inputQueue.remove(); + return ArgumentParseResult.success(entry.get().value()); + } + // todo + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + } + + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.registry(commandContext).streamEntries().map(entry -> { + if (entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + return entry.key().value(); + } + return entry.key().asString(); + }).collect(Collectors.toList()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + if (this.registryType.equals(RegistryTypes.SOUND_TYPE)) { + return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode() + .suggestions(ClientSuggestionProviders.AVAILABLE_SOUNDS); + } else if (this.registryType.equals(RegistryTypes.BIOME)) { + return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode() + .suggestions(ClientSuggestionProviders.AVAILABLE_BIOMES); + } else if (this.registryType.equals(RegistryTypes.ENTITY_TYPE)) { + return ClientCompletionKeys.ENTITY_SUMMON.get().createNode() + .suggestions(ClientSuggestionProviders.SUMMONABLE_ENTITIES); + } else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { + return ClientCompletionKeys.ITEM_ENCHANTMENT.get().createNode(); + } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { + return ClientCompletionKeys.MOB_EFFECT.get().createNode(); + } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { + // todo: should we use custom suggestions? sponge seems to include non-vanilla dimension types in it's registry. + return ClientCompletionKeys.DIMENSION.get().createNode(); + } + return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode().customSuggestions(); + } + + } + + static @Nullable ResourceKey resourceKey(final @NonNull String input) { + try { + return ResourceKey.resolve(input); + } catch (final IllegalStateException ex) { + return null; + } + } + + public static final class Builder extends TypedBuilder> { + + private final RegistryType registryType; + private final Function, RegistryHolder> holderSupplier; + + Builder( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + super(valueType, name); + this.registryType = registryType; + this.holderSupplier = holderSupplier; + } + + @Override + public @NonNull RegistryEntryArgument build() { + return new RegistryEntryArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getValueType(), + this.holderSupplier, + this.registryType, + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java new file mode 100644 index 00000000..cde6460c --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -0,0 +1,166 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.SingleEntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.Entity; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class SingleEntitySelectorArgument extends CommandArgument { + + private SingleEntitySelectorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + SingleEntitySelector.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull SingleEntitySelectorArgument optional(final @NonNull String name) { + return SingleEntitySelectorArgument.builder(name).asOptional().build(); + } + + public static @NonNull SingleEntitySelectorArgument of(final @NonNull String name) { + return SingleEntitySelectorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull SingleEntitySelector> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final Selector selector; + try { + selector = Selector.parse(input); + } catch (final IllegalArgumentException ex) { + return ArgumentParseResult.failure(ex); // todo + } + if (selector.limit() != 1) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); // todo + } + final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); + return selector.select(cause) + .stream() + .findFirst() + .map(entity -> { + inputQueue.remove(); + return ArgumentParseResult.success( + (SingleEntitySelector) new SingleEntitySelectorImpl(selector, input, entity) + ); + }) + .orElse(ArgumentParseResult.failure(new IllegalArgumentException("sadge"))); // todo + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ENTITY.get().createNode().single(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(SingleEntitySelector.class, name); + } + + @Override + public @NonNull SingleEntitySelectorArgument build() { + return new SingleEntitySelectorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + + private static final class SingleEntitySelectorImpl implements SingleEntitySelector { + + private final Selector selector; + private final String inputString; + private final Entity result; + + private SingleEntitySelectorImpl( + final Selector selector, + final String inputString, + final Entity result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Entity getSingle() { + return this.result; + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java new file mode 100644 index 00000000..a7da6176 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -0,0 +1,169 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.SinglePlayerSelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.living.player.Player; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class SinglePlayerSelectorArgument extends CommandArgument { + + private SinglePlayerSelectorArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + SinglePlayerSelector.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull SinglePlayerSelectorArgument optional(final @NonNull String name) { + return SinglePlayerSelectorArgument.builder(name).asOptional().build(); + } + + public static @NonNull SinglePlayerSelectorArgument of(final @NonNull String name) { + return SinglePlayerSelectorArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull SinglePlayerSelector> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final Selector selector; + try { + selector = Selector.parse(input); + } catch (final IllegalArgumentException ex) { + return ArgumentParseResult.failure(ex); // todo + } + if (!selector.playersOnly()) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); // todo + } + if (selector.limit() != 1) { + return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); // todo + } + final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); + return selector.select(cause) + .stream().map(it -> (Player) it) + .findFirst() + .map(player -> { + inputQueue.remove(); + return ArgumentParseResult.success( + (SinglePlayerSelector) new SinglePlayerSelectorImpl(selector, input, player) + ); + }) + .orElse(ArgumentParseResult.failure(new IllegalArgumentException("sadge"))); // todo + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ENTITY.get().createNode().playersOnly().single(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(SinglePlayerSelector.class, name); + } + + @Override + public @NonNull SinglePlayerSelectorArgument build() { + return new SinglePlayerSelectorArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + + private static final class SinglePlayerSelectorImpl implements SinglePlayerSelector { + + private final Selector selector; + private final String inputString; + private final Player result; + + private SinglePlayerSelectorImpl( + final Selector selector, + final String inputString, + final Player result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Player getSingle() { + return this.result; + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java similarity index 63% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 9712d784..c1aec721 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/EnchantmentTypeArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -26,26 +26,23 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.item.enchantment.EnchantmentType; -import org.spongepowered.api.registry.RegistryEntry; -import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.server.ServerWorld; import java.util.List; import java.util.Optional; import java.util.Queue; import java.util.function.BiFunction; +import java.util.stream.Collectors; -public final class EnchantmentTypeArgument extends CommandArgument { +public final class WorldArgument extends CommandArgument { - private EnchantmentTypeArgument( + private WorldArgument( final boolean required, final @NonNull String name, final @NonNull String defaultValue, @@ -57,73 +54,70 @@ private EnchantmentTypeArgument( name, new Parser<>(), defaultValue, - EnchantmentType.class, + ServerWorld.class, suggestionsProvider, defaultDescription ); } - public static @NonNull EnchantmentTypeArgument optional(final @NonNull String name) { - return EnchantmentTypeArgument.builder(name).asOptional().build(); + public static @NonNull WorldArgument optional(final @NonNull String name) { + return WorldArgument.builder(name).asOptional().build(); } - public static @NonNull EnchantmentTypeArgument of(final @NonNull String name) { - return EnchantmentTypeArgument.builder(name).build(); + public static @NonNull WorldArgument of(final @NonNull String name) { + return WorldArgument.builder(name).build(); } public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } - public static final class Parser implements NodeSupplyingArgumentParser { + public static final class Parser implements ArgumentParser { @Override - public @NonNull ArgumentParseResult<@NonNull EnchantmentType> parse( + public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { final String input = inputQueue.peek(); - final ResourceKey key = resourceKey(input); + final ResourceKey key = RegistryEntryArgument.resourceKey(input); if (key == null) { // todo return ArgumentParseResult.failure(new IllegalArgumentException("invalid key!")); } - final Optional> entry = Sponge.game() - .registries() - .registry(RegistryTypes.ENCHANTMENT_TYPE) - .findEntry(key); + final Optional entry = Sponge.server().worldManager().world(key); if (entry.isPresent()) { inputQueue.remove(); - return ArgumentParseResult.success(entry.get().value()); + return ArgumentParseResult.success(entry.get()); } // todo return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); } @Override - public CommandTreeNode.@NonNull Argument> node() { - return ClientCompletionKeys.ITEM_ENCHANTMENT.get().createNode(); + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return Sponge.server().worldManager().worlds().stream().map(world -> { + if (world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + return world.key().value(); + } + return world.key().asString(); + }).collect(Collectors.toList()); } } - static @Nullable ResourceKey resourceKey(final @NonNull String input) { - try { - return ResourceKey.resolve(input); - } catch (final IllegalStateException ex) { - return null; - } - } - - public static final class Builder extends TypedBuilder> { + public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { - super(EnchantmentType.class, name); + super(ServerWorld.class, name); } @Override - public @NonNull EnchantmentTypeArgument build() { - return new EnchantmentTypeArgument<>( + public @NonNull WorldArgument build() { + return new WorldArgument<>( this.isRequired(), this.getName(), this.getDefaultValue(), diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java new file mode 100644 index 00000000..6068418a --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java @@ -0,0 +1,34 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.spongepowered.api.entity.Entity; + +/** + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may only select any number of + * {@link org.spongepowered.api.entity.Entity Entities}. + */ +public interface MultipleEntitySelector extends SelectorWrapper { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java new file mode 100644 index 00000000..7e65bef3 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java @@ -0,0 +1,33 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.spongepowered.api.entity.living.player.Player; + +/** + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may only select {@link Player Players}. + */ +public interface MultiplePlayerSelector extends SelectorWrapper { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java new file mode 100644 index 00000000..a4d36cfe --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java @@ -0,0 +1,85 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.Entity; + +import java.util.Collection; +import java.util.Collections; + + +/** + * Cloud wrapper for {@link org.spongepowered.api.command.selector.Selector}. + * + * @param entity subtype + */ +public interface SelectorWrapper { + + /** + * Get the raw string associated with the selector. + * + * @return the input + */ + @NonNull String inputString(); + + /** + * Get the wrapped {@link Selector}. + * + * @return the selector + */ + @NonNull Selector selector(); + + /** + * Resolve the value of this selector. + * + *

A successfully parsed selector must match one or more values

+ * + * @return all matched entities + */ + @NonNull Collection get(); + + /** + * A specialized selector that can only return one value. + * + * @param the value type + */ + interface Single extends SelectorWrapper { + + @Override + default @NonNull Collection get() { + return Collections.singletonList(this.getSingle()); + } + + /** + * Get the single value from this selector. + * + * @return the value + */ + @NonNull E getSingle(); + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java new file mode 100644 index 00000000..4fd85a2e --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java @@ -0,0 +1,34 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.spongepowered.api.entity.Entity; + +/** + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select {@code 1} or {@code 0} + * {@link Entity Entities}. + */ +public interface SingleEntitySelector extends SelectorWrapper.Single { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java new file mode 100644 index 00000000..32a7e3e6 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java @@ -0,0 +1,34 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.spongepowered.api.entity.living.player.Player; + +/** + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select {@code 1} or {@code 0} + * {@link Player Players}. + */ +public interface SinglePlayerSelector extends SelectorWrapper.Single { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java new file mode 100644 index 00000000..062bad6f --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java @@ -0,0 +1,27 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +/** + * Data holders for sponge. + */ +package cloud.commandframework.sponge.data; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index a31821d0..ecdb60a8 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -27,51 +27,97 @@ import cloud.commandframework.arguments.standard.DoubleArgument; import cloud.commandframework.arguments.standard.IntegerArgument; import cloud.commandframework.arguments.standard.StringArgument; +import cloud.commandframework.context.CommandContext; import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; -import cloud.commandframework.sponge.argument.EnchantmentTypeArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; +import cloud.commandframework.sponge.argument.RegistryEntryArgument; +import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; +import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.TypeLiteral; +import io.leangen.geantyref.TypeToken; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.parameter.managed.operator.Operators; import org.spongepowered.api.data.Keys; +import org.spongepowered.api.effect.sound.SoundType; +import org.spongepowered.api.entity.EntityType; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.enchantment.Enchantment; import org.spongepowered.api.item.enchantment.EnchantmentType; import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.item.inventory.Slot; import org.spongepowered.api.item.inventory.entity.Hotbar; import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; +import org.spongepowered.api.registry.RegistryHolder; +import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.service.permission.Subject; +import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.plugin.jvm.Plugin; +import java.util.function.Function; + import static net.kyori.adventure.text.Component.space; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLUE; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; import static net.kyori.adventure.text.format.NamedTextColor.RED; +import static net.kyori.adventure.text.format.TextColor.color; @Plugin("cloud-example-sponge") public final class CloudExamplePlugin { + private static final Component COMMAND_PREFIX = text() + .color(color(0x333333)) + .content("[") + .append(text("Cloud-Sponge", color(0xF7CF0D))) + .append(text(']')) + .build(); + private final SpongeCommandManager commandManager; + /** + * Create example plugin instance + * + * @param injector injector + */ @Inject public CloudExamplePlugin(final @NonNull Injector injector) { + // Create child injector with cloud module final Injector childInjector = injector.createChildInjector( CloudInjectionModule.createNative(CommandExecutionCoordinator.simpleCoordinator()) ); + + // Get command manager instance this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral>() { })); + + // Use Cloud's enhanced number suggestions + this.commandManager.parserMapper().cloudNumberSuggestions(true); + + // Register minecraft-extras exception handlers + new MinecraftExceptionHandler() + .withDefaultHandlers() + .withDecorator(message -> TextComponent.ofChildren(COMMAND_PREFIX, space(), message)) + .apply(this.commandManager, CommandCause::audience); + this.registerCommands(); } @@ -82,15 +128,15 @@ private void registerCommands() { .literal("test") .literal("test1") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - final Command.Builder cloud_test2 = this.commandManager.commandBuilder("cloud_test2"); - this.commandManager.command(cloud_test2.literal("test") + final Command.Builder cloudTest2 = this.commandManager.commandBuilder("cloud_test2"); + this.commandManager.command(cloudTest2.literal("test") .argument(StringArgument.single("string_arg")) .literal("test2") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloud_test2.literal("test") + this.commandManager.command(cloudTest2.literal("test") .literal("literal_arg") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloud_test2.literal("another_test") + this.commandManager.command(cloudTest2.literal("another_test") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("string_test") .argument(StringArgument.single("single")) @@ -104,7 +150,7 @@ private void registerCommands() { .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("enchantment_type_test") - .argument(EnchantmentTypeArgument.of("enchantment_type")) + .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { final Subject subject = ctx.getSender().subject(); @@ -172,7 +218,7 @@ private void registerCommands() { .argument(DoubleArgument.of("value")) .handler(ctx -> { final Subject subject = ctx.getSender().subject(); - if (!(subject instanceof Player)) { + if (!(subject instanceof Player)) { // todo: a solution to this ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); return; } @@ -192,6 +238,52 @@ private void registerCommands() { final int currentXp = player.get(Keys.EXPERIENCE).get(); player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); })); + this.commandManager.command(this.commandManager.commandBuilder("selectplayer") + .argument(SinglePlayerSelectorArgument.of("player")) + .handler(ctx -> { + final Player player = ctx.get("player").getSingle(); + ctx.getSender().audience().sendMessage(TextComponent.ofChildren( + text("Display name of selected player: ", GRAY), + player.displayName().get() + )); + })); + this.commandManager.command(this.commandManager.commandBuilder("world_test") + .argument(WorldArgument.of("world")) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(text(ctx.get("world").key().asString())); + })); + this.commandManager.command(this.commandManager.commandBuilder("give_item") + .argument(SinglePlayerSelectorArgument.of("player")) + .argument(RegistryEntryArgument.of("type", ItemType.class, RegistryTypes.ITEM_TYPE)) + .handler(ctx -> { + final Player player = ctx.get("player").getSingle(); + player.inventory().offer(ItemStack.of(ctx.get("type"))); + })); + this.commandManager.command(this.commandManager.commandBuilder("test_entity_type") + .argument(RegistryEntryArgument.of("type", new TypeToken>() { + }, RegistryTypes.ENTITY_TYPE)) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(ctx.>get("type")); + })); + final Function, RegistryHolder> holderFunction = ctx -> ctx.getSender() + .location() + .orElse(Sponge.server().worldManager().defaultWorld().location(0, 0, 0)) + .world() + .registries(); + this.commandManager.command(this.commandManager.commandBuilder("test_biomes") + .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) + .handler(ctx -> { + final ResourceKey biomeKey = holderFunction.apply(ctx) + .registry(RegistryTypes.BIOME) + .findValueKey(ctx.get("biome")) + .orElseThrow(IllegalStateException::new); + ctx.getSender().audience().sendMessage(text(biomeKey.asString())); + })); + this.commandManager.command(this.commandManager.commandBuilder("test_sounds") + .argument(RegistryEntryArgument.of("type", SoundType.class, RegistryTypes.SOUND_TYPE)) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(text(ctx.get("type").key().asString())); + })); } } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java new file mode 100644 index 00000000..f8e78d06 --- /dev/null +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java @@ -0,0 +1,27 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +/** + * Cloud example for Sponge API v8 + */ +package cloud.commandframework.examples.sponge; From 6ec83cc6debc4b55f85aee3cc9b50954e2391bb3 Mon Sep 17 00:00:00 2001 From: jmp Date: Sat, 24 Apr 2021 18:05:47 -0700 Subject: [PATCH 10/72] sponge: Prioritize registered parser mappers to allow for overriding default behavior --- .../sponge/SpongeParserMapper.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 49897340..85ecce80 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -75,21 +75,19 @@ public final class SpongeParserMapper { CommandTreeNode.Argument> toSponge(final CommandArgument value) { final CommandTreeNode.Argument> result; final ArgumentParser parser = value.getParser(); - if (parser instanceof NodeSupplyingArgumentParser) { + final Mapping mapper = this.mappers.get(parser.getClass()); + if (mapper != null) { + final CommandTreeNode.Argument> apply = + (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); + if (mapper.cloudSuggestions) { + apply.customSuggestions(); + return apply; + } + result = apply; + } else if (parser instanceof NodeSupplyingArgumentParser) { result = ((NodeSupplyingArgumentParser) parser).node(); } else { - final Mapping mapper = this.mappers.get(parser.getClass()); - if (mapper != null) { - final CommandTreeNode.Argument> apply = - (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); - if (mapper.cloudSuggestions) { - apply.customSuggestions(); - return apply; - } - result = apply; - } else { - result = ClientCompletionKeys.STRING.get().createNode().word(); - } + result = ClientCompletionKeys.STRING.get().createNode().word(); } final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); if (customSuggestionsProvider) { @@ -184,10 +182,9 @@ private void initStandardMappers() { * * @param cloudType cloud argument parser type * @param configurer builder configurer - * @param argument value type * @param cloud argument parser type */ - public > void registerMapping( + public > void registerMapping( final @NonNull TypeToken cloudType, final @NonNull Consumer> configurer ) { From 0761caee455a3dc0c03f57fd6b81a9820d582e6a Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 25 Apr 2021 18:22:23 -0700 Subject: [PATCH 11/72] sponge: Implement more parsers, random fixes and improvements --- .DS_Store | Bin 0 -> 6148 bytes cloud-minecraft/.DS_Store | Bin 0 -> 6148 bytes cloud-minecraft/cloud-sponge/build.gradle.kts | 12 ++ .../sponge/CloudSpongeCommand.java | 10 +- .../sponge/SpongeCommandManager.java | 22 ++- .../sponge/SpongeCommandPreprocessor.java | 13 +- .../sponge/SpongeParserMapper.java | 17 ++- .../argument/ItemStackSnapshotArgument.java | 126 ++++++++++++++++++ .../MultipleEntitySelectorArgument.java | 4 +- .../MultiplePlayerSelectorArgument.java | 6 +- .../sponge/argument/OperatorArgument.java | 17 ++- .../argument/RegistryEntryArgument.java | 24 ++-- .../sponge/argument/ResourceKeyUtil.java | 65 +++++++++ .../sponge/argument/SelectorUtil.java | 67 ++++++++++ .../SingleEntitySelectorArgument.java | 6 +- .../SinglePlayerSelectorArgument.java | 8 +- .../sponge/argument/Vector3dArgument.java | 123 +++++++++++++++++ .../sponge/argument/WorldArgument.java | 15 +-- examples/example-sponge/build.gradle.kts | 6 + .../examples/sponge/CloudExamplePlugin.java | 83 ++++++++---- 20 files changed, 545 insertions(+), 79 deletions(-) create mode 100644 .DS_Store create mode 100644 cloud-minecraft/.DS_Store create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7ca8f1a41c7a5cc539659b7dc839ad67546b933e GIT binary patch literal 6148 zcmeHK%}OId5Uw^+I}u3^f;slZTZ9DHzk@Ku?7^EbvU^xXXEIqcFiuNmV$f`sd5!gr z_6hcNtm>{T>t+`Zf=K9s>aV)Hs)zcZyQTm@bVgAdpbh{Mm9SjJ;U7Z#q;s;wD`iAs z&WK^s zwU17&Ztfo@-=^PxSe^wwOGavpGk8Sfg|zSdVVdal8a?Th5@bk7Z&AtM^!`eEMwi1y zWPmS+TwBECTuzPw$H1!?p!Y$c5_*hOeRKh|Dn{R~1Nr$B1JcPo`5y28%LI5GO zhN9W=9~q!;Hw_n%fQAly{(doBgx&USnCK8=Uc=iYZfCXHn<$JG$0sJGEX(pt`P9GG zT|W!5PP-Abj;XgFWY?jy5427`>>xaho87a@+_p}$AWoYtlN?7)3^_T9(@1w4x|2q2 zGmmcvq%6tOS!JQu+gz?!)#^sQUsb*J^;%V}EU)$ZB{{!X-`YFBxqs+A_Me_D%L0E$ zBeM<%@PfvV8@}^fX`<6Bj2Yw)@)(%`W`G$OAqLzLC#ObePrMaofEoB52IzcHsDz%w z+@d);u%YWCjTZ??(5ANpp>pUs%q`*wim<7OHdVMMhOp`AS1!(Tm|L{zAk4}*k6T%| z7m6^eqhFbD5S~SDnE__tD+6P;TcP^D`}6z%YZCXE0cK#N7!buBf2V<4aNzS2#pM=1QqVA^7-OjvFQ6Jhzaj(CbC_F14+>ud3=P~c1AofEI|89p$N&HU literal 0 HcmV?d00001 diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index d748bf71..72598322 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -1,5 +1,17 @@ +import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform + +plugins { + id("org.spongepowered.gradle.vanilla") version "0.2-SNAPSHOT" +} + dependencies { api(project(":cloud-core")) + implementation(project(":cloud-brigadier")) compileOnly("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") } + +minecraft { + version("1.16.5") + platform(MinecraftPlatform.SERVER) +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 47f677d0..edfd74a7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -77,7 +77,7 @@ final class CloudSpongeCommand implements Command.Raw { public CommandResult process(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { final C cloudSender = this.commandManager.backwardsCauseMapper().apply(cause); final Audience audience = cause.audience(); - final String input = this.formatCommand(arguments.input()); + final String input = this.formatCommandForParsing(arguments.input()); this.commandManager.executeCommand(cloudSender, input).whenComplete((result, throwable) -> { if (throwable == null) { return; @@ -159,7 +159,7 @@ private static Component getMessage(final Throwable throwable) { public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { return this.commandManager.suggest( this.commandManager.backwardsCauseMapper().apply(cause), - this.formatCommand(arguments.input()) + this.formatCommandForSuggestions(arguments.input()) ); } @@ -222,7 +222,7 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node new WorldArgument.Parser<>() ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(ItemStackSnapshot.class), + params -> new ItemStackSnapshotArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(Vector3d.class), + params -> new Vector3dArgument.Parser<>() + ); // Entity selectors this.getParserRegistry().registerParserSupplier( @@ -149,21 +161,21 @@ private void registerRegistryParsers() { continue; } - final RegistryType key; + final RegistryType registryType; try { - key = (RegistryType) field.get(null); + registryType = (RegistryType) field.get(null); } catch (final IllegalAccessException ex) { throw new RuntimeException("Failed to access RegistryTypes." + field.getName(), ex); } - if (ignoredRegistryTypes.contains(key) || !(key instanceof DefaultedRegistryType)) { + if (ignoredRegistryTypes.contains(registryType) || !(registryType instanceof DefaultedRegistryType)) { continue; } - final DefaultedRegistryType registryType = (DefaultedRegistryType) key; + final DefaultedRegistryType defaultedRegistryType = (DefaultedRegistryType) registryType; final Type valueType = ((ParameterizedType) generic).getActualTypeArguments()[0]; this.getParserRegistry().registerParserSupplier( TypeToken.get(valueType), - params -> new RegistryEntryArgument.Parser<>(registryType) + params -> new RegistryEntryArgument.Parser<>(defaultedRegistryType) ); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index e20dc2dd..c9c856a1 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -23,9 +23,11 @@ // package cloud.commandframework.sponge; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import cloud.commandframework.execution.preprocessor.CommandPreprocessor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.CommandCause; /** * Command preprocessor which decorates incoming {@link cloud.commandframework.context.CommandContext} @@ -48,10 +50,13 @@ final class SpongeCommandPreprocessor implements CommandPreprocessor { @Override public void accept(final @NonNull CommandPreprocessingContext context) { - context.getCommandContext().store( - SpongeCommandContextKeys.COMMAND_CAUSE_KEY, - this.commandManager.causeMapper().apply(context.getCommandContext().getSender()) - ); + final CommandCause commandCause = this.commandManager.causeMapper().apply(context.getCommandContext().getSender()); + context.getCommandContext().store(SpongeCommandContextKeys.COMMAND_CAUSE_KEY, commandCause); + + // For WrappedBrigadierParser. The CloudBrigadierManager will store this in context as well, however we are not using + // the CloudBrigadierManager, only the WrapperBrigadierParser. CommandCause is mixed into CommandSourceStack, which is + // Minecraft's native Brigadier sender type on the server. + context.getCommandContext().store(WrappedBrigadierParser.COMMAND_CONTEXT_BRIGADIER_NATIVE_SENDER, commandCause); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 85ecce80..14c25aa6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -34,6 +34,7 @@ import cloud.commandframework.arguments.standard.ShortArgument; import cloud.commandframework.arguments.standard.StringArgument; import cloud.commandframework.arguments.standard.StringArrayArgument; +import cloud.commandframework.arguments.standard.UUIDArgument; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; @@ -87,7 +88,7 @@ CommandTreeNode.Argument> toSponge(final C } else if (parser instanceof NodeSupplyingArgumentParser) { result = ((NodeSupplyingArgumentParser) parser).node(); } else { - result = ClientCompletionKeys.STRING.get().createNode().word(); + result = ClientCompletionKeys.STRING.get().createNode().customSuggestions().word(); } final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); if (customSuggestionsProvider) { @@ -101,11 +102,11 @@ private void initStandardMappers() { }, builder -> builder.to(stringParser -> { final StringArgument.StringMode mode = stringParser.getStringMode(); if (mode == StringArgument.StringMode.SINGLE) { - return ClientCompletionKeys.STRING.get().createNode().word(); + return ClientCompletionKeys.STRING.get().createNode().customSuggestions().word(); } else if (mode == StringArgument.StringMode.QUOTED) { - return ClientCompletionKeys.STRING.get().createNode(); + return ClientCompletionKeys.STRING.get().createNode().customSuggestions(); } else if (mode == StringArgument.StringMode.GREEDY) { - return ClientCompletionKeys.STRING.get().createNode().greedy(); + return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); } throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); })); @@ -168,11 +169,15 @@ private void initStandardMappers() { })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(flagArgumentParser -> { - return ClientCompletionKeys.STRING.get().createNode().greedy(); + return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(stringArrayParser -> { - return ClientCompletionKeys.STRING.get().createNode().greedy(); + return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); + })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(uuidParser -> { + return ClientCompletionKeys.UUID.get().createNode(); })); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java new file mode 100644 index 00000000..7d5cdb99 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java @@ -0,0 +1,126 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.arguments.item.ItemArgument; +import net.minecraft.commands.arguments.item.ItemInput; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.ItemStackSnapshot; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class ItemStackSnapshotArgument extends CommandArgument { + + private ItemStackSnapshotArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + ItemStackSnapshot.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull ItemStackSnapshotArgument optional(final @NonNull String name) { + return ItemStackSnapshotArgument.builder(name).asOptional().build(); + } + + public static @NonNull ItemStackSnapshotArgument of(final @NonNull String name) { + return ItemStackSnapshotArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(ItemArgument.item()).map((ctx, itemInput) -> { + try { + return ArgumentParseResult.success( + ((ItemStack) (Object) itemInput.createItemStack(1, true)).createSnapshot() + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull ItemStackSnapshot> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ITEM_STACK.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(ItemStackSnapshot.class, name); + } + + @Override + public @NonNull ItemStackSnapshotArgument build() { + return new ItemStackSnapshotArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 421e9e27..47942052 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -87,12 +87,12 @@ public static final class Parser implements NodeSupplyingArgumentParser result = selector.select(cause); if (result.isEmpty()) { - return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + return SelectorUtil.noEntitiesFound(); } inputQueue.remove(); return ArgumentParseResult.success(new MultipleEntitySelectorImpl( diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index 78244652..501e9b7b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -88,16 +88,16 @@ public static final class Parser implements NodeSupplyingArgumentParser result = selector.select(cause).stream() .map(e -> (Player) e).collect(Collectors.toList()); if (result.isEmpty()) { - return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + return SelectorUtil.noPlayersFound(); } inputQueue.remove(); return ArgumentParseResult.success(new MultiplePlayerSelectorImpl( diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 67e42388..3be1b7cc 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -28,6 +28,8 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.commands.arguments.OperationArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.parameter.managed.operator.Operator; @@ -74,6 +76,18 @@ private OperatorArgument( public static final class Parser implements NodeSupplyingArgumentParser { + private static final SimpleCommandExceptionType ERROR_INVALID_OPERATION; + + static { + try { + // todo: use an accessor (Sponge has one but we don't have a way of using it) + ERROR_INVALID_OPERATION = (SimpleCommandExceptionType) OperationArgument.class + .getDeclaredField("ERROR_INVALID_OPERATION").get(null); + } catch (final ReflectiveOperationException ex) { + throw new RuntimeException("Couldn't access ERROR_INVALID_OPERATION command exception type.", ex); + } + } + @Override public @NonNull ArgumentParseResult<@NonNull Operator> parse( @NonNull final CommandContext<@NonNull C> commandContext, @@ -84,8 +98,7 @@ public static final class Parser implements NodeSupplyingArgumentParser op.asString().equals(input)) .findFirst(); if (!operator.isPresent()) { - // todo - return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + return ArgumentParseResult.failure(ERROR_INVALID_OPERATION.create()); } inputQueue.remove(); return ArgumentParseResult.success(operator.get()); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index d642b1df..e84d450f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -48,6 +48,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; public final class RegistryEntryArgument extends CommandArgument { // todo: should we return a RegistryEntry? @@ -184,6 +185,7 @@ private RegistryEntryArgument( public static final class Parser implements NodeSupplyingArgumentParser { + private final Function, RegistryHolder> holderSupplier; private final RegistryType registryType; @@ -209,18 +211,16 @@ private Registry registry(final @NonNull CommandContext commandContext) { @NonNull final Queue<@NonNull String> inputQueue ) { final String input = inputQueue.peek(); - final ResourceKey key = resourceKey(input); + final ResourceKey key = ResourceKeyUtil.resourceKey(input); if (key == null) { - // todo - return ArgumentParseResult.failure(new IllegalArgumentException("invalid key!")); + return ResourceKeyUtil.invalidResourceKey(); } final Optional> entry = this.registry(commandContext).findEntry(key); if (entry.isPresent()) { inputQueue.remove(); return ArgumentParseResult.success(entry.get().value()); } - // todo - return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + return ArgumentParseResult.failure(new IllegalArgumentException("no such entry in registry")); // todo } @Override @@ -228,11 +228,11 @@ private Registry registry(final @NonNull CommandContext commandContext) { final @NonNull CommandContext commandContext, final @NonNull String input ) { - return this.registry(commandContext).streamEntries().map(entry -> { + return this.registry(commandContext).streamEntries().flatMap(entry -> { if (entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { - return entry.key().value(); + return Stream.of(entry.key().value(), entry.key().asString()); } - return entry.key().asString(); + return Stream.of(entry.key().asString()); }).collect(Collectors.toList()); } @@ -260,14 +260,6 @@ private Registry registry(final @NonNull CommandContext commandContext) { } - static @Nullable ResourceKey resourceKey(final @NonNull String input) { - try { - return ResourceKey.resolve(input); - } catch (final IllegalStateException ex) { - return null; - } - } - public static final class Builder extends TypedBuilder> { private final RegistryType registryType; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java new file mode 100644 index 00000000..b6e70d8d --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java @@ -0,0 +1,65 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.resources.ResourceLocation; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.ResourceKey; + +/** + * Shared utilities for ResourceKey based arguments. Not API. + */ +final class ResourceKeyUtil { + + private ResourceKeyUtil() { + } + + private static final SimpleCommandExceptionType ERROR_INVALID_RESOURCE_LOCATION; + + static { + try { + // todo: use an accessor + ERROR_INVALID_RESOURCE_LOCATION = (SimpleCommandExceptionType) ResourceLocation.class + .getDeclaredField("ERROR_INVALID").get(null); + } catch (final ReflectiveOperationException ex) { + throw new RuntimeException("Couldn't access ERROR_INVALID command exception type.", ex); + } + } + + static ArgumentParseResult invalidResourceKey() { + return ArgumentParseResult.failure(ERROR_INVALID_RESOURCE_LOCATION.create()); + } + + static @Nullable ResourceKey resourceKey(final @NonNull String input) { + try { + return ResourceKey.resolve(input); + } catch (final IllegalStateException ex) { + return null; + } + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java new file mode 100644 index 00000000..ad827355 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java @@ -0,0 +1,67 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import net.kyori.adventure.util.ComponentMessageThrowable; +import net.minecraft.commands.arguments.EntityArgument; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Shared utilities for Selector arguments. Not API. + */ +final class SelectorUtil { + + private SelectorUtil() { + } + + static @NonNull ArgumentParseResult selectorParseFailure(final @NonNull IllegalArgumentException ex) { + final Throwable cause = ex.getCause(); + if (cause instanceof ComponentMessageThrowable) { + return ArgumentParseResult.failure(cause); + } + return ArgumentParseResult.failure(ex); + } + + static @NonNull ArgumentParseResult onlyPlayersAllowed() { + return ArgumentParseResult.failure(EntityArgument.ERROR_ONLY_PLAYERS_ALLOWED.create()); + } + + static @NonNull ArgumentParseResult notSinglePlayer() { + return ArgumentParseResult.failure(EntityArgument.ERROR_NOT_SINGLE_PLAYER.create()); + } + + static @NonNull ArgumentParseResult notSingleEntity() { + return ArgumentParseResult.failure(EntityArgument.ERROR_NOT_SINGLE_ENTITY.create()); + } + + static @NonNull ArgumentParseResult noPlayersFound() { + return ArgumentParseResult.failure(EntityArgument.NO_PLAYERS_FOUND.create()); + } + + static @NonNull ArgumentParseResult noEntitiesFound() { + return ArgumentParseResult.failure(EntityArgument.NO_ENTITIES_FOUND.create()); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index cde6460c..a0814342 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -86,10 +86,10 @@ public static final class Parser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser extends CommandArgument { + + private Vector3dArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + Vector3d.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull Vector3dArgument optional(final @NonNull String name) { + return Vector3dArgument.builder(name).asOptional().build(); + } + + public static @NonNull Vector3dArgument of(final @NonNull String name) { + return Vector3dArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(Vec3Argument.vec3()).map((ctx, coordinates) -> { + return ArgumentParseResult.success(VecHelper.toVector3d( + coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) + )); + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull Vector3d> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.VEC3.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(Vector3d.class, name); + } + + @Override + public @NonNull Vector3dArgument build() { + return new Vector3dArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index c1aec721..6d9ee107 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -39,6 +39,7 @@ import java.util.Queue; import java.util.function.BiFunction; import java.util.stream.Collectors; +import java.util.stream.Stream; public final class WorldArgument extends CommandArgument { @@ -80,18 +81,16 @@ public static final class Parser implements ArgumentParser { @NonNull final Queue<@NonNull String> inputQueue ) { final String input = inputQueue.peek(); - final ResourceKey key = RegistryEntryArgument.resourceKey(input); + final ResourceKey key = ResourceKeyUtil.resourceKey(input); if (key == null) { - // todo - return ArgumentParseResult.failure(new IllegalArgumentException("invalid key!")); + return ResourceKeyUtil.invalidResourceKey(); } final Optional entry = Sponge.server().worldManager().world(key); if (entry.isPresent()) { inputQueue.remove(); return ArgumentParseResult.success(entry.get()); } - // todo - return ArgumentParseResult.failure(new IllegalArgumentException("sadge")); + return ArgumentParseResult.failure(new IllegalArgumentException("no such world")); // todo } @Override @@ -99,11 +98,11 @@ public static final class Parser implements ArgumentParser { final @NonNull CommandContext commandContext, final @NonNull String input ) { - return Sponge.server().worldManager().worlds().stream().map(world -> { + return Sponge.server().worldManager().worlds().stream().flatMap(world -> { if (world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { - return world.key().value(); + return Stream.of(world.key().value(), world.key().asString()); } - return world.key().asString(); + return Stream.of(world.key().asString()); }).collect(Collectors.toList()); } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index e1cf5397..868f933f 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -32,3 +32,9 @@ tasks { dependsOn(shadowJar) } } + +configurations { + spongeRuntime { + resolutionStrategy.cacheChangingModulesFor(1, "MINUTES") + } +} diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index ecdb60a8..159a55de 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -32,10 +32,12 @@ import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; +import cloud.commandframework.sponge.argument.ItemStackSnapshotArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; import cloud.commandframework.sponge.argument.RegistryEntryArgument; import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; +import cloud.commandframework.sponge.argument.Vector3dArgument; import cloud.commandframework.sponge.argument.WorldArgument; import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.google.common.collect.ImmutableList; @@ -54,13 +56,17 @@ import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.parameter.managed.operator.Operators; import org.spongepowered.api.data.Keys; +import org.spongepowered.api.data.type.ProfessionType; +import org.spongepowered.api.data.type.VillagerType; import org.spongepowered.api.effect.sound.SoundType; import org.spongepowered.api.entity.EntityType; +import org.spongepowered.api.entity.EntityTypes; import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.item.ItemType; +import org.spongepowered.api.entity.living.trader.Villager; import org.spongepowered.api.item.enchantment.Enchantment; import org.spongepowered.api.item.enchantment.EnchantmentType; import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.item.inventory.Slot; import org.spongepowered.api.item.inventory.entity.Hotbar; import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; @@ -68,7 +74,9 @@ import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.service.permission.Subject; import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.math.vector.Vector3d; import org.spongepowered.plugin.jvm.Plugin; import java.util.function.Function; @@ -78,6 +86,7 @@ import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLUE; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; +import static net.kyori.adventure.text.format.NamedTextColor.GREEN; import static net.kyori.adventure.text.format.NamedTextColor.RED; import static net.kyori.adventure.text.format.TextColor.color; @@ -122,34 +131,34 @@ public CloudExamplePlugin(final @NonNull Injector injector) { } private void registerCommands() { - this.commandManager.command(this.commandManager.commandBuilder("cloud_test") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("cloud_test1") + .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + this.commandManager.command(this.commandManager.commandBuilder("cloud_test2") .literal("test") .literal("test1") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - final Command.Builder cloudTest2 = this.commandManager.commandBuilder("cloud_test2"); - this.commandManager.command(cloudTest2.literal("test") - .argument(StringArgument.single("string_arg")) + final Command.Builder cloudTest3 = this.commandManager.commandBuilder("cloud_test3"); + final Command.Builder test = cloudTest3.literal("test"); + this.commandManager.command(test.argument(StringArgument.single("string_arg")) .literal("test2") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloudTest2.literal("test") - .literal("literal_arg") + this.commandManager.command(test.literal("literal_arg") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloudTest2.literal("another_test") + this.commandManager.command(cloudTest3.literal("another_test") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(this.commandManager.commandBuilder("string_test") + final Command.Builder cloudSponge = this.commandManager.commandBuilder("cloud_sponge"); + this.commandManager.command(cloudSponge.literal("string_test") .argument(StringArgument.single("single")) .argument(StringArgument.quoted("quoted")) .argument(StringArgument.greedy("greedy")) .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(this.commandManager.commandBuilder("int_test") + this.commandManager.command(cloudSponge.literal("int_test") .argument(IntegerArgument.of("any")) .argument(IntegerArgument.newBuilder("gt0").withMin(1)) .argument(IntegerArgument.newBuilder("lt100").withMax(99)) .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(this.commandManager.commandBuilder("enchantment_type_test") + this.commandManager.command(cloudSponge.literal("enchantment_type_test") .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { @@ -178,7 +187,7 @@ private void registerCommands() { .build(); slot.set(modified); })); - this.commandManager.command(this.commandManager.commandBuilder("color_test") + this.commandManager.command(cloudSponge.literal("color_test") .argument(NamedTextColorArgument.of("color")) .argument(StringArgument.greedy("message")) .handler(ctx -> { @@ -186,7 +195,7 @@ private void registerCommands() { text(ctx.get("message"), ctx.get("color")) ); })); - this.commandManager.command(this.commandManager.commandBuilder("operator_test") + this.commandManager.command(cloudSponge.literal("operator_test") .argument(IntegerArgument.of("first")) .argument(OperatorArgument.of("operator")) .argument(IntegerArgument.of("second")) @@ -213,7 +222,7 @@ private void registerCommands() { .append(text(((Operator.Simple) operator).apply(first, second))) ); })); - this.commandManager.command(this.commandManager.commandBuilder("modifylevel") + this.commandManager.command(cloudSponge.literal("modifylevel") .argument(OperatorArgument.of("operator")) .argument(DoubleArgument.of("value")) .handler(ctx -> { @@ -238,7 +247,7 @@ private void registerCommands() { final int currentXp = player.get(Keys.EXPERIENCE).get(); player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); })); - this.commandManager.command(this.commandManager.commandBuilder("selectplayer") + this.commandManager.command(cloudSponge.literal("selectplayer") .argument(SinglePlayerSelectorArgument.of("player")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); @@ -247,19 +256,19 @@ private void registerCommands() { player.displayName().get() )); })); - this.commandManager.command(this.commandManager.commandBuilder("world_test") + this.commandManager.command(cloudSponge.literal("world_test") .argument(WorldArgument.of("world")) .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("world").key().asString())); })); - this.commandManager.command(this.commandManager.commandBuilder("give_item") + this.commandManager.command(cloudSponge.literal("give_item") .argument(SinglePlayerSelectorArgument.of("player")) - .argument(RegistryEntryArgument.of("type", ItemType.class, RegistryTypes.ITEM_TYPE)) + .argument(ItemStackSnapshotArgument.of("item")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); - player.inventory().offer(ItemStack.of(ctx.get("type"))); + player.inventory().offer(ctx.get("item").createStack()); })); - this.commandManager.command(this.commandManager.commandBuilder("test_entity_type") + this.commandManager.command(cloudSponge.literal("test_entity_type") .argument(RegistryEntryArgument.of("type", new TypeToken>() { }, RegistryTypes.ENTITY_TYPE)) .handler(ctx -> { @@ -270,7 +279,7 @@ private void registerCommands() { .orElse(Sponge.server().worldManager().defaultWorld().location(0, 0, 0)) .world() .registries(); - this.commandManager.command(this.commandManager.commandBuilder("test_biomes") + this.commandManager.command(cloudSponge.literal("test_biomes") .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) .handler(ctx -> { final ResourceKey biomeKey = holderFunction.apply(ctx) @@ -279,11 +288,39 @@ private void registerCommands() { .orElseThrow(IllegalStateException::new); ctx.getSender().audience().sendMessage(text(biomeKey.asString())); })); - this.commandManager.command(this.commandManager.commandBuilder("test_sounds") + this.commandManager.command(cloudSponge.literal("test_sounds") .argument(RegistryEntryArgument.of("type", SoundType.class, RegistryTypes.SOUND_TYPE)) .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("type").key().asString())); })); + this.commandManager.command(cloudSponge.literal("summon_villager") + .argument(RegistryEntryArgument.of("type", VillagerType.class, RegistryTypes.VILLAGER_TYPE)) + .argument(RegistryEntryArgument.of("profession", ProfessionType.class, RegistryTypes.PROFESSION_TYPE)) + .handler(ctx -> { + final ServerLocation loc = ctx.getSender().location().orElse(null); + if (loc == null) { + ctx.getSender().audience().sendMessage(text("No location!")); + return; + } + final ServerWorld world = loc.world(); + final Villager villager = world.createEntity(EntityTypes.VILLAGER, loc.position()); + villager.offer(Keys.VILLAGER_TYPE, ctx.get("type")); + villager.offer(Keys.PROFESSION_TYPE, ctx.get("profession")); + if (world.spawnEntity(villager)) { + ctx.getSender().audience().sendMessage(text() + .append(text("Spawned entity!", GREEN)) + .append(space()) + .append(villager.displayName().get()) + .hoverEvent(villager)); + } else { + ctx.getSender().audience().sendMessage(text("failed to spawn :(")); + } + })); + this.commandManager.command(cloudSponge.literal("vec3d") + .argument(Vector3dArgument.of("vec3d")) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(text(ctx.get("vec3d").toString())); + })); } } From d7d02b161f00989aa30b46c9ac638468828e4b03 Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 25 Apr 2021 18:47:05 -0700 Subject: [PATCH 12/72] sponge: Set fields accessible --- .../commandframework/sponge/argument/OperatorArgument.java | 7 +++++-- .../commandframework/sponge/argument/ResourceKeyUtil.java | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 3be1b7cc..19795277 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -37,6 +37,7 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.registry.RegistryTypes; +import java.lang.reflect.Field; import java.util.List; import java.util.Optional; import java.util.Queue; @@ -81,8 +82,10 @@ public static final class Parser implements NodeSupplyingArgumentParser Date: Mon, 26 Apr 2021 02:29:53 -0700 Subject: [PATCH 13/72] sponge: Add more argument parsers --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 +- .../sponge/SpongeCaptionKeys.java | 87 +++++++ .../sponge/SpongeCaptionRegistry.java | 82 ++++++ .../sponge/SpongeCommandManager.java | 69 ++++- .../sponge/SpongeParserParameters.java | 50 ++++ .../sponge/annotations/package-info.java | 28 ++ .../sponge/annotations/specifier/Center.java | 41 +++ .../annotations/specifier/package-info.java | 28 ++ .../sponge/argument/BlockStateArgument.java | 116 +++++++++ .../sponge/argument/ComponentArgument.java | 118 +++++++++ .../argument/DataContainerArgument.java | 119 +++++++++ .../sponge/argument/GameProfileArgument.java | 135 ++++++++++ .../GameProfileCollectionArgument.java | 141 ++++++++++ .../MultipleEntitySelectorArgument.java | 42 +-- .../MultiplePlayerSelectorArgument.java | 45 ++-- .../argument/NamedTextColorArgument.java | 4 +- .../argument/RegistryEntryArgument.java | 34 ++- .../sponge/argument/ResourceKeyArgument.java | 115 +++++++++ .../sponge/argument/SelectorUtil.java | 67 ----- .../SingleEntitySelectorArgument.java | 44 ++-- .../SinglePlayerSelectorArgument.java | 47 ++-- .../sponge/argument/UserArgument.java | 242 ++++++++++++++++++ .../sponge/argument/Vector2dArgument.java | 151 +++++++++++ .../sponge/argument/Vector2iArgument.java | 146 +++++++++++ .../sponge/argument/Vector3dArgument.java | 71 ++++- .../sponge/argument/Vector3iArgument.java | 145 +++++++++++ .../sponge/argument/VectorArgument.java | 111 ++++++++ .../sponge/argument/WorldArgument.java | 30 ++- .../sponge/data/GameProfileCollection.java | 45 ++++ .../sponge/data/SelectorWrapper.java | 18 +- .../examples/sponge/CloudExamplePlugin.java | 82 ++++-- 31 files changed, 2264 insertions(+), 191 deletions(-) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java delete mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index 72598322..12cc316c 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -13,5 +13,5 @@ dependencies { minecraft { version("1.16.5") - platform(MinecraftPlatform.SERVER) + platform(MinecraftPlatform.JOINED) } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java new file mode 100644 index 00000000..8e3cbf88 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -0,0 +1,87 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +package cloud.commandframework.sponge; + +import cloud.commandframework.captions.Caption; +import org.checkerframework.checker.nullness.qual.NonNull; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; + +/** + * {@link Caption} instances for messages in cloud-sponge. + */ +public final class SpongeCaptionKeys { + + private static final Collection RECOGNIZED_CAPTIONS = new HashSet<>(); + + /** + * Variables: {id}, {registry} + */ + public static final Caption ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY = of( + "argument.parse.failure.registry_entry.unknown_entry" + ); + + /** + * Variables: {name} + */ + public static final Caption ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME = of( + "argument.parse.failure.user.cannot_find_user_with_name" + ); + + /** + * Variables: {uuid} + */ + public static final Caption ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID = of( + "argument.parse.failure.user.cannot_find_user_with_uuid" + ); + + /** + * Variables: {input} + */ + public static final Caption ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT = of( + "argument.parse.failure.user.invalid_input" + ); + + private SpongeCaptionKeys() { + } + + private static @NonNull Caption of(final @NonNull String key) { + final Caption caption = Caption.of(key); + RECOGNIZED_CAPTIONS.add(caption); + return caption; + } + + /** + * Get an immutable collection containing all standard caption keys + * + * @return Immutable collection of keys + */ + public static @NonNull Collection<@NonNull Caption> spongeCaptionKeys() { + return Collections.unmodifiableCollection(RECOGNIZED_CAPTIONS); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java new file mode 100644 index 00000000..7de9e361 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -0,0 +1,82 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +package cloud.commandframework.sponge; + +import cloud.commandframework.captions.SimpleCaptionRegistry; + +/** + * Caption registry that uses bi-functions to produce messages. + * + * @param command sender type + */ +public class SpongeCaptionRegistry extends SimpleCaptionRegistry { + + /** + * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY} + */ + public static final String ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY = + "No such entry '{id}' in registry '{registry}'."; + + /** + * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME} + */ + public static final String ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME = + "Cannot find a user with the name '{name}'."; + + /** + * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID} + */ + public static final String ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID = + "Cannot find a user with the UUID '{uuid}'."; + + /** + * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT} + */ + public static final String ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT = + "Input '{input}' is not a valid UUID or username."; + + protected SpongeCaptionRegistry() { + super(); + + this.registerMessageFactory( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY + ); + this.registerMessageFactory( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME + ); + this.registerMessageFactory( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID + ); + this.registerMessageFactory( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT + ); + } + + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 2baac35b..4c38496e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -25,19 +25,32 @@ import cloud.commandframework.CommandManager; import cloud.commandframework.CommandTree; +import cloud.commandframework.arguments.parser.ParserParameters; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; +import cloud.commandframework.sponge.annotations.specifier.Center; +import cloud.commandframework.sponge.argument.BlockStateArgument; +import cloud.commandframework.sponge.argument.ComponentArgument; +import cloud.commandframework.sponge.argument.DataContainerArgument; +import cloud.commandframework.sponge.argument.GameProfileArgument; +import cloud.commandframework.sponge.argument.GameProfileCollectionArgument; import cloud.commandframework.sponge.argument.ItemStackSnapshotArgument; import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; import cloud.commandframework.sponge.argument.MultiplePlayerSelectorArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; import cloud.commandframework.sponge.argument.RegistryEntryArgument; +import cloud.commandframework.sponge.argument.ResourceKeyArgument; import cloud.commandframework.sponge.argument.SingleEntitySelectorArgument; import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; +import cloud.commandframework.sponge.argument.UserArgument; +import cloud.commandframework.sponge.argument.Vector2dArgument; +import cloud.commandframework.sponge.argument.Vector2iArgument; import cloud.commandframework.sponge.argument.Vector3dArgument; +import cloud.commandframework.sponge.argument.Vector3iArgument; import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.GameProfileCollection; import cloud.commandframework.sponge.data.MultipleEntitySelector; import cloud.commandframework.sponge.data.MultiplePlayerSelector; import cloud.commandframework.sponge.data.SingleEntitySelector; @@ -48,15 +61,22 @@ import io.leangen.geantyref.TypeToken; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.item.inventory.ItemStackSnapshot; +import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.registry.DefaultedRegistryType; import org.spongepowered.api.registry.RegistryType; import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.math.vector.Vector2d; +import org.spongepowered.math.vector.Vector2i; import org.spongepowered.math.vector.Vector3d; +import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.PluginContainer; import java.lang.reflect.Field; @@ -105,10 +125,15 @@ public SpongeCommandManager( this.parserMapper = new SpongeParserMapper<>(); this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); + this.setCaptionRegistry(new SpongeCaptionRegistry<>()); Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); } private void registerParsers() { + this.getParserRegistry().registerParserSupplier( + TypeToken.get(ComponentArgument.class), + params -> new ComponentArgument.Parser<>() + ); this.getParserRegistry().registerParserSupplier( TypeToken.get(NamedTextColor.class), params -> new NamedTextColorArgument.Parser<>() @@ -125,9 +150,51 @@ private void registerParsers() { TypeToken.get(ItemStackSnapshot.class), params -> new ItemStackSnapshotArgument.Parser<>() ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(ResourceKey.class), + params -> new ResourceKeyArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(GameProfile.class), + params -> new GameProfileArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(GameProfileCollection.class), + params -> new GameProfileCollectionArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(BlockStateArgument.class), + params -> new BlockStateArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(User.class), + params -> new UserArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(DataContainer.class), + params -> new DataContainerArgument.Parser<>() + ); + + // Position arguments + this.getParserRegistry().registerAnnotationMapper( + Center.class, + (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(Vector2d.class), + params -> new Vector2dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + ); this.getParserRegistry().registerParserSupplier( TypeToken.get(Vector3d.class), - params -> new Vector3dArgument.Parser<>() + params -> new Vector3dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(Vector2i.class), + params -> new Vector2iArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(Vector3i.class), + params -> new Vector3iArgument.Parser<>() ); // Entity selectors diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java new file mode 100644 index 00000000..4678d9c8 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java @@ -0,0 +1,50 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.arguments.parser.ParserParameter; +import io.leangen.geantyref.TypeToken; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * {@link ParserParameter} keys for cloud-sponge. + */ +public final class SpongeParserParameters { + + private SpongeParserParameters() { + } + + /** + * Indicates that positions should be centered on the middle of blocks, i.e. x.5. + */ + public static final ParserParameter CENTER_INTEGERS = create("center_integers", TypeToken.get(Boolean.class)); + + private static @NonNull ParserParameter create( + final @NonNull String key, + final @NonNull TypeToken expectedType + ) { + return new ParserParameter<>(key, expectedType); + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java new file mode 100644 index 00000000..58830dec --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java @@ -0,0 +1,28 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +/** + * Annotations for cloud-sponge. + */ +package cloud.commandframework.sponge.annotations; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java new file mode 100644 index 00000000..48fbe327 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java @@ -0,0 +1,41 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.annotations.specifier; + +import cloud.commandframework.sponge.argument.Vector2dArgument; +import cloud.commandframework.sponge.argument.Vector3dArgument; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation used to enable coordinate centering for {@link Vector3dArgument} and {@link Vector2dArgument}. + */ +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface Center { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java new file mode 100644 index 00000000..8b1ce7e6 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java @@ -0,0 +1,28 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +/** + * Specifier annotations for cloud-sponge. + */ +package cloud.commandframework.sponge.annotations.specifier; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java new file mode 100644 index 00000000..b295ee56 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java @@ -0,0 +1,116 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import net.minecraft.commands.arguments.blocks.BlockInput; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class BlockStateArgument extends CommandArgument { + + private BlockStateArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + BlockState.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull BlockStateArgument optional(final @NonNull String name) { + return BlockStateArgument.builder(name).asOptional().build(); + } + + public static @NonNull BlockStateArgument of(final @NonNull String name) { + return BlockStateArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(net.minecraft.commands.arguments.blocks.BlockStateArgument.block()) + .map((ctx, blockInput) -> ArgumentParseResult.success((BlockState) blockInput.getState())); + + @Override + public @NonNull ArgumentParseResult<@NonNull BlockState> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.BLOCK_STATE.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(BlockState.class, name); + } + + @Override + public @NonNull BlockStateArgument build() { + return new BlockStateArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java new file mode 100644 index 00000000..492e502c --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -0,0 +1,118 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.common.adventure.SpongeAdventure; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class ComponentArgument extends CommandArgument { + + private ComponentArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + Component.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull ComponentArgument optional(final @NonNull String name) { + return ComponentArgument.builder(name).asOptional().build(); + } + + public static @NonNull ComponentArgument of(final @NonNull String name) { + return ComponentArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.ComponentArgument.textComponent() + ).map((ctx, component) -> + ArgumentParseResult.success(SpongeAdventure.asAdventure(component))); + + @Override + public @NonNull ArgumentParseResult<@NonNull Component> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.COMPONENT.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(Component.class, name); + } + + @Override + public @NonNull ComponentArgument build() { + return new ComponentArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java new file mode 100644 index 00000000..8ca1080e --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java @@ -0,0 +1,119 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import net.minecraft.commands.arguments.CompoundTagArgument; +import net.minecraft.nbt.CompoundTag; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.common.data.persistence.NBTTranslator; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class DataContainerArgument extends CommandArgument { + + private DataContainerArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + DataContainer.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull DataContainerArgument optional(final @NonNull String name) { + return DataContainerArgument.builder(name).asOptional().build(); + } + + public static @NonNull DataContainerArgument of(final @NonNull String name) { + return DataContainerArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(CompoundTagArgument.compoundTag()) + .map((ctx, compoundTag) -> + ArgumentParseResult.success(NBTTranslator.INSTANCE.translate(compoundTag))); + + @Override + public @NonNull ArgumentParseResult<@NonNull DataContainer> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.NBT_COMPOUND_TAG.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(DataContainer.class, name); + } + + @Override + public @NonNull DataContainerArgument build() { + return new DataContainerArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java new file mode 100644 index 00000000..fcfecc39 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -0,0 +1,135 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.common.profile.SpongeGameProfile; + +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class GameProfileArgument extends CommandArgument { + + private GameProfileArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + GameProfile.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull GameProfileArgument optional(final @NonNull String name) { + return GameProfileArgument.builder(name).asOptional().build(); + } + + public static @NonNull GameProfileArgument of(final @NonNull String name) { + return GameProfileArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.GameProfileArgument.gameProfile() + ).map((ctx, argumentResult) -> { + final Collection profiles; + try { + profiles = argumentResult.getNames( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + if (profiles.size() > 1) { + return ArgumentParseResult.failure(new IllegalArgumentException("too many profiles")); + } + final GameProfile profile = SpongeGameProfile.of(profiles.iterator().next()); + return ArgumentParseResult.success(profile); + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull GameProfile> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.GAME_PROFILE.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(GameProfile.class, name); + } + + @Override + public @NonNull GameProfileArgument build() { + return new GameProfileArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java new file mode 100644 index 00000000..18f66433 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -0,0 +1,141 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.GameProfileCollection; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.common.profile.SpongeGameProfile; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; + +public final class GameProfileCollectionArgument extends CommandArgument { + + private GameProfileCollectionArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + GameProfileCollection.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull GameProfileCollectionArgument optional(final @NonNull String name) { + return GameProfileCollectionArgument.builder(name).asOptional().build(); + } + + public static @NonNull GameProfileCollectionArgument of(final @NonNull String name) { + return GameProfileCollectionArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.GameProfileArgument.gameProfile() + ).map((ctx, argumentResult) -> { + final Collection profiles; + try { + profiles = argumentResult.getNames( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + final List result = profiles.stream() + .map(SpongeGameProfile::of).collect(Collectors.toList()); + return ArgumentParseResult.success(new GameProfileCollection() { + @Override + public @NonNull Collection<@NonNull GameProfile> gameProfiles() { + return Collections.unmodifiableCollection(result); + } + }); + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull GameProfileCollection> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.GAME_PROFILE.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(GameProfileCollection.class, name); + } + + @Override + public @NonNull GameProfileCollectionArgument build() { + return new GameProfileCollectionArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 47942052..63945343 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -26,13 +26,18 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultipleEntitySelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.selector.Selector; @@ -42,6 +47,7 @@ import java.util.List; import java.util.Queue; import java.util.function.BiFunction; +import java.util.stream.Collectors; public final class MultipleEntitySelectorArgument extends CommandArgument { @@ -77,29 +83,31 @@ private MultipleEntitySelectorArgument( public static final class Parser implements NodeSupplyingArgumentParser { + final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entities()); + @Override public @NonNull ArgumentParseResult<@NonNull MultipleEntitySelector> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { - final String input = inputQueue.peek(); - final Selector selector; - try { - selector = Selector.parse(input); - } catch (final IllegalArgumentException ex) { - return SelectorUtil.selectorParseFailure(ex); + final String originalInput = String.join(" ", inputQueue); + final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); + if (result.getFailure().isPresent()) { + return ArgumentParseResult.failure(result.getFailure().get()); } - final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); - final Collection result = selector.select(cause); - if (result.isEmpty()) { - return SelectorUtil.noEntitiesFound(); + final String consumedInput = String.join(" ", inputQueue); + final EntitySelector parsed = result.getParsedValue().get(); + final List entities; + try { + entities = parsed.findEntities( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ).stream().map(e -> (Entity) e).collect(Collectors.toList()); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); } - inputQueue.remove(); - return ArgumentParseResult.success(new MultipleEntitySelectorImpl( - selector, - input, - result - )); + final int consumedChars = originalInput.length() - consumedInput.length(); + final String input = originalInput.substring(0, consumedChars); + return ArgumentParseResult.success(new MultipleEntitySelectorImpl((Selector) parsed, input, entities)); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index 501e9b7b..732b4ba0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -26,13 +26,18 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultiplePlayerSelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.selector.Selector; @@ -78,33 +83,31 @@ private MultiplePlayerSelectorArgument( public static final class Parser implements NodeSupplyingArgumentParser { + final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.players()); + @Override public @NonNull ArgumentParseResult<@NonNull MultiplePlayerSelector> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { - final String input = inputQueue.peek(); - final Selector selector; - try { - selector = Selector.parse(input); - } catch (final IllegalArgumentException ex) { - return SelectorUtil.selectorParseFailure(ex); + final String originalInput = String.join(" ", inputQueue); + final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); + if (result.getFailure().isPresent()) { + return ArgumentParseResult.failure(result.getFailure().get()); } - if (!selector.playersOnly()) { - return SelectorUtil.onlyPlayersAllowed(); - } - final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); - final Collection result = selector.select(cause).stream() - .map(e -> (Player) e).collect(Collectors.toList()); - if (result.isEmpty()) { - return SelectorUtil.noPlayersFound(); + final String consumedInput = String.join(" ", inputQueue); + final EntitySelector parsed = result.getParsedValue().get(); + final List players; + try { + players = parsed.findPlayers( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ).stream().map(p -> (Player) p).collect(Collectors.toList()); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); } - inputQueue.remove(); - return ArgumentParseResult.success(new MultiplePlayerSelectorImpl( - selector, - input, - result - )); + final int consumedChars = originalInput.length() - consumedInput.length(); + final String input = originalInput.substring(0, consumedChars); + return ArgumentParseResult.success(new MultiplePlayerSelectorImpl((Selector) parsed, input, players)); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index fa35cfdf..7753d773 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -29,6 +29,7 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import net.kyori.adventure.text.format.NamedTextColor; +import net.minecraft.commands.arguments.ColorArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.Sponge; @@ -89,8 +90,7 @@ public static final class Parser implements NodeSupplyingArgumentParser registry(final @NonNull CommandContext commandContext) { inputQueue.remove(); return ArgumentParseResult.success(entry.get().value()); } - return ArgumentParseResult.failure(new IllegalArgumentException("no such entry in registry")); // todo + return ArgumentParseResult.failure(new NoSuchEntryException(commandContext, key, this.registryType)); } @Override @@ -260,6 +263,12 @@ private Registry registry(final @NonNull CommandContext commandContext) { } + /** + * Builder for {@link RegistryEntryArgument}. + * + * @param sender type + * @param value type + */ public static final class Builder extends TypedBuilder> { private final RegistryType registryType; @@ -292,4 +301,27 @@ public static final class Builder extends TypedBuilder } + /** + * An exception thrown when there is no entry for the provided {@link ResourceKey} in the resolved registry. + */ + private static final class NoSuchEntryException extends ParserException { + + private static final long serialVersionUID = 4472876671109079272L; + + NoSuchEntryException( + final CommandContext context, + final ResourceKey key, + final RegistryType registryType + ) { + super( + Parser.class, + context, + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, + CaptionVariable.of("id", key.asString()), + CaptionVariable.of("registry", registryType.location().asString()) + ); + } + + } + } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java new file mode 100644 index 00000000..7fcb8069 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -0,0 +1,115 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class ResourceKeyArgument extends CommandArgument { + + private ResourceKeyArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + ResourceKey.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull ResourceKeyArgument optional(final @NonNull String name) { + return ResourceKeyArgument.builder(name).asOptional().build(); + } + + public static @NonNull ResourceKeyArgument of(final @NonNull String name) { + return ResourceKeyArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + @Override + public @NonNull ArgumentParseResult<@NonNull ResourceKey> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String input = inputQueue.peek(); + final ResourceKey key = ResourceKeyUtil.resourceKey(input); + if (key == null) { + return ResourceKeyUtil.invalidResourceKey(); + } + inputQueue.remove(); + return ArgumentParseResult.success(key); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(ResourceKey.class, name); + } + + @Override + public @NonNull ResourceKeyArgument build() { + return new ResourceKeyArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java deleted file mode 100644 index ad827355..00000000 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SelectorUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2021 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import net.kyori.adventure.util.ComponentMessageThrowable; -import net.minecraft.commands.arguments.EntityArgument; -import org.checkerframework.checker.nullness.qual.NonNull; - -/** - * Shared utilities for Selector arguments. Not API. - */ -final class SelectorUtil { - - private SelectorUtil() { - } - - static @NonNull ArgumentParseResult selectorParseFailure(final @NonNull IllegalArgumentException ex) { - final Throwable cause = ex.getCause(); - if (cause instanceof ComponentMessageThrowable) { - return ArgumentParseResult.failure(cause); - } - return ArgumentParseResult.failure(ex); - } - - static @NonNull ArgumentParseResult onlyPlayersAllowed() { - return ArgumentParseResult.failure(EntityArgument.ERROR_ONLY_PLAYERS_ALLOWED.create()); - } - - static @NonNull ArgumentParseResult notSinglePlayer() { - return ArgumentParseResult.failure(EntityArgument.ERROR_NOT_SINGLE_PLAYER.create()); - } - - static @NonNull ArgumentParseResult notSingleEntity() { - return ArgumentParseResult.failure(EntityArgument.ERROR_NOT_SINGLE_ENTITY.create()); - } - - static @NonNull ArgumentParseResult noPlayersFound() { - return ArgumentParseResult.failure(EntityArgument.NO_PLAYERS_FOUND.create()); - } - - static @NonNull ArgumentParseResult noEntitiesFound() { - return ArgumentParseResult.failure(EntityArgument.NO_ENTITIES_FOUND.create()); - } - -} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index a0814342..8bff3db2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -26,13 +26,18 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SingleEntitySelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.selector.Selector; @@ -76,32 +81,31 @@ private SingleEntitySelectorArgument( public static final class Parser implements NodeSupplyingArgumentParser { + final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entity()); + @Override public @NonNull ArgumentParseResult<@NonNull SingleEntitySelector> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { - final String input = inputQueue.peek(); - final Selector selector; - try { - selector = Selector.parse(input); - } catch (final IllegalArgumentException ex) { - return SelectorUtil.selectorParseFailure(ex); + final String originalInput = String.join(" ", inputQueue); + final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); + if (result.getFailure().isPresent()) { + return ArgumentParseResult.failure(result.getFailure().get()); } - if (selector.limit() != 1) { - return SelectorUtil.notSingleEntity(); + final String consumedInput = String.join(" ", inputQueue); + final EntitySelector parsed = result.getParsedValue().get(); + final Entity entity; + try { + entity = (Entity) parsed.findSingleEntity( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); } - final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); - return selector.select(cause) - .stream() - .findFirst() - .map(entity -> { - inputQueue.remove(); - return ArgumentParseResult.success( - (SingleEntitySelector) new SingleEntitySelectorImpl(selector, input, entity) - ); - }) - .orElse(SelectorUtil.noEntitiesFound()); + final int consumedChars = originalInput.length() - consumedInput.length(); + final String input = originalInput.substring(0, consumedChars); + return ArgumentParseResult.success(new SingleEntitySelectorImpl((Selector) parsed, input, entity)); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index c96d3484..7b2655f7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -26,13 +26,18 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SinglePlayerSelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.selector.Selector; @@ -76,35 +81,31 @@ private SinglePlayerSelectorArgument( public static final class Parser implements NodeSupplyingArgumentParser { + final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.player()); + @Override public @NonNull ArgumentParseResult<@NonNull SinglePlayerSelector> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { - final String input = inputQueue.peek(); - final Selector selector; - try { - selector = Selector.parse(input); - } catch (final IllegalArgumentException ex) { - return SelectorUtil.selectorParseFailure(ex); + final String originalInput = String.join(" ", inputQueue); + final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); + if (result.getFailure().isPresent()) { + return ArgumentParseResult.failure(result.getFailure().get()); } - if (!selector.playersOnly()) { - return SelectorUtil.onlyPlayersAllowed(); - } - if (selector.limit() != 1) { - return SelectorUtil.notSinglePlayer(); + final String consumedInput = String.join(" ", inputQueue); + final EntitySelector parsed = result.getParsedValue().get(); + final Player player; + try { + player = (Player) parsed.findSinglePlayer( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); } - final CommandCause cause = commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY); - return selector.select(cause) - .stream().map(it -> (Player) it) - .findFirst() - .map(player -> { - inputQueue.remove(); - return ArgumentParseResult.success( - (SinglePlayerSelector) new SinglePlayerSelectorImpl(selector, input, player) - ); - }) - .orElse(SelectorUtil.noPlayersFound()); + final int consumedChars = originalInput.length() - consumedInput.length(); + final String input = originalInput.substring(0, consumedChars); + return ArgumentParseResult.success(new SinglePlayerSelectorImpl((Selector) parsed, input, player)); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java new file mode 100644 index 00000000..e73c6e05 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -0,0 +1,242 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.captions.Caption; +import cloud.commandframework.captions.CaptionVariable; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.exceptions.parsing.ParserException; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCaptionKeys; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.UUID; +import java.util.function.BiFunction; +import java.util.stream.Collectors; + +public final class UserArgument extends CommandArgument { + + private UserArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + User.class, + suggestionsProvider, + defaultDescription + ); + } + + public static @NonNull UserArgument optional(final @NonNull String name) { + return UserArgument.builder(name).asOptional().build(); + } + + public static @NonNull UserArgument of(final @NonNull String name) { + return UserArgument.builder(name).build(); + } + + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + final ArgumentParser singlePlayerSelectorParser = new WrappedBrigadierParser<>(EntityArgument.player()); + + @Override + public @NonNull ArgumentParseResult<@NonNull User> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + final String peek = inputQueue.peek(); + if (peek.startsWith("@")) { + return this.handleSelector(commandContext, inputQueue); + } + + try { + final Optional optionalUser = Sponge.server().userManager().find(peek); + // valid username + if (optionalUser.isPresent()) { + inputQueue.remove(); + return ArgumentParseResult.success(optionalUser.get()); + } + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.NAME, peek + )); + } catch (final IllegalArgumentException ex) { + // not a valid username + } + + try { + final UUID uuid = UUID.fromString(peek); + // valid uuid + final Optional optionalUser = Sponge.server().userManager().find(uuid); + if (optionalUser.isPresent()) { + inputQueue.remove(); + return ArgumentParseResult.success(optionalUser.get()); + } + + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.UUID, peek + )); + } catch (final IllegalArgumentException ex) { + // not a valid uuid + } + + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.INVALID_INPUT, peek + )); + } + + private @NonNull ArgumentParseResult<@NonNull User> handleSelector( + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull Queue<@NonNull String> inputQueue + ) { + final ArgumentParseResult result = this.singlePlayerSelectorParser.parse(commandContext, inputQueue); + if (result.getFailure().isPresent()) { + return ArgumentParseResult.failure(result.getFailure().get()); + } + final EntitySelector parsed = result.getParsedValue().get(); + final ServerPlayer player; + try { + player = (ServerPlayer) parsed.findSinglePlayer( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(player.user()); + } + + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + final List suggestions = new ArrayList<>(this.singlePlayerSelectorParser.suggestions(commandContext, input)); + if (!input.startsWith("@")) { + suggestions.addAll(Sponge.server().userManager().streamOfMatches(input) + .map(profile -> profile.name().orElse(null)) + .filter(Objects::nonNull) + .filter(name -> !suggestions.contains(name)) + .collect(Collectors.toList())); + } + return suggestions; + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.GAME_PROFILE.get().createNode().customSuggestions(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(User.class, name); + } + + @Override + public @NonNull UserArgument build() { + return new UserArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + + /** + * An exception thrown when a {@link User} cannot be found for the provided input. + */ + private static final class UserNotFoundException extends ParserException { + + private static final long serialVersionUID = -24501459406523175L; + + UserNotFoundException( + final CommandContext context, + final @NonNull Type type, + final @NonNull String input + ) { + super( + Parser.class, + context, + type.caption, + type.variable(input) + ); + } + + private enum Type { + UUID("uuid", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID), + NAME("name", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME), + INVALID_INPUT("input", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT); + + private final String key; + private final Caption caption; + + Type(final @NonNull String key, final @NonNull Caption caption) { + this.key = key; + this.caption = caption; + } + + CaptionVariable variable(final @NonNull String input) { + return CaptionVariable.of(this.key, input); + } + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java new file mode 100644 index 00000000..ba3d21a2 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -0,0 +1,151 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import net.minecraft.commands.arguments.coordinates.Vec2Argument; +import net.minecraft.world.phys.Vec3; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.math.vector.Vector2d; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class Vector2dArgument extends VectorArgument { + + private Vector2dArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final boolean centerIntegers, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(centerIntegers), + defaultValue, + Vector2d.class, + centerIntegers, + suggestionsProvider, + defaultDescription + ); + } + + /** + * Create a new optional {@link Vector2dArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument optional(final @NonNull String name) { + return Vector2dArgument.builder(name).asOptional().build(); + } + + /** + * Create a new required {@link Vector2dArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument of(final @NonNull String name) { + return Vector2dArgument.builder(name).build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser; + + public Parser(final boolean centerIntegers) { + this.mappedParser = new WrappedBrigadierParser(new Vec2Argument(centerIntegers)) + .map((ctx, coordinates) -> { + final Vec3 position = coordinates.getPosition( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + return ArgumentParseResult.success(new Vector2d(position.x, position.z)); + }); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull Vector2d> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.VEC2.get().createNode(); + } + + } + + public static final class Builder extends VectorArgumentBuilder> { + + Builder(final @NonNull String name) { + super(Vector2d.class, name); + } + + @Override + public @NonNull Vector2dArgument build() { + return new Vector2dArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.centerIntegers(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java new file mode 100644 index 00000000..f8762acd --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -0,0 +1,146 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.ColumnPosArgument; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import net.minecraft.core.BlockPos; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.math.vector.Vector2i; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +public final class Vector2iArgument extends CommandArgument { + + private Vector2iArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + Vector2i.class, + suggestionsProvider, + defaultDescription + ); + } + + /** + * Create a new optional {@link Vector2iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector2iArgument} + */ + public static @NonNull Vector2iArgument optional(final @NonNull String name) { + return Vector2iArgument.builder(name).asOptional().build(); + } + + /** + * Create a new required {@link Vector2iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector2iArgument} + */ + public static @NonNull Vector2iArgument of(final @NonNull String name) { + return Vector2iArgument.builder(name).build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(ColumnPosArgument.columnPos()) + .map((ctx, coordinates) -> { + final BlockPos pos = coordinates.getBlockPos( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ); + return ArgumentParseResult.success(new Vector2i(pos.getX(), pos.getZ())); + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull Vector2i> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.COLUMN_POS.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(Vector2i.class, name); + } + + @Override + public @NonNull Vector2iArgument build() { + return new Vector2iArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index edeb5f46..68fc69c5 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -24,7 +24,6 @@ package cloud.commandframework.sponge.argument; import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; @@ -45,46 +44,97 @@ import java.util.Queue; import java.util.function.BiFunction; -public final class Vector3dArgument extends CommandArgument { +public final class Vector3dArgument extends VectorArgument { private Vector3dArgument( final boolean required, final @NonNull String name, final @NonNull String defaultValue, + final boolean centerIntegers, final @Nullable BiFunction, String, List> suggestionsProvider, final @NonNull ArgumentDescription defaultDescription ) { super( required, name, - new Parser<>(), + new Parser<>(centerIntegers), defaultValue, Vector3d.class, + centerIntegers, suggestionsProvider, defaultDescription ); } + /** + * Create a new optional {@link Vector3dArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector3dArgument} + */ public static @NonNull Vector3dArgument optional(final @NonNull String name) { return Vector3dArgument.builder(name).asOptional().build(); } + /** + * Create a new required {@link Vector3dArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector3dArgument} + */ public static @NonNull Vector3dArgument of(final @NonNull String name) { return Vector3dArgument.builder(name).build(); } + /** + * Create a new optional {@link Vector3dArgument}. + * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param sender type + * @return a new {@link Vector3dArgument} + */ + public static @NonNull Vector3dArgument optional(final @NonNull String name, final boolean centerIntegers) { + return Vector3dArgument.builder(name).asOptional().centerIntegers(centerIntegers).build(); + } + + /** + * Create a new required {@link Vector3dArgument}. + * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param sender type + * @return a new {@link Vector3dArgument} + */ + public static @NonNull Vector3dArgument of(final @NonNull String name, final boolean centerIntegers) { + return Vector3dArgument.builder(name).centerIntegers(centerIntegers).build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } public static final class Parser implements NodeSupplyingArgumentParser { - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(Vec3Argument.vec3()).map((ctx, coordinates) -> { - return ArgumentParseResult.success(VecHelper.toVector3d( - coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) - )); - }); + private final ArgumentParser mappedParser; + + public Parser(final boolean centerIntegers) { + this.mappedParser = new WrappedBrigadierParser(new Vec3Argument(centerIntegers)) + .map((ctx, coordinates) -> { + return ArgumentParseResult.success(VecHelper.toVector3d( + coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) + )); + }); + } @Override public @NonNull ArgumentParseResult<@NonNull Vector3d> parse( @@ -101,7 +151,7 @@ public static final class Parser implements NodeSupplyingArgumentParser extends TypedBuilder> { + public static final class Builder extends VectorArgumentBuilder> { Builder(final @NonNull String name) { super(Vector3d.class, name); @@ -113,6 +163,7 @@ public static final class Builder extends TypedBuilder extends CommandArgument { + + private Vector3iArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + Vector3i.class, + suggestionsProvider, + defaultDescription + ); + } + + /** + * Create a new optional {@link Vector3iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector3iArgument} + */ + public static @NonNull Vector3iArgument optional(final @NonNull String name) { + return Vector3iArgument.builder(name).asOptional().build(); + } + + /** + * Create a new required {@link Vector3iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector3iArgument} + */ + public static @NonNull Vector3iArgument of(final @NonNull String name) { + return Vector3iArgument.builder(name).build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(BlockPosArgument.blockPos()) + .map((ctx, coordinates) -> { + return ArgumentParseResult.success(VecHelper.toVector3i( + coordinates.getBlockPos((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) + )); + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull Vector3i> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.BLOCK_POS.get().createNode(); + } + + } + + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(Vector3i.class, name); + } + + @Override + public @NonNull Vector3iArgument build() { + return new Vector3iArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java new file mode 100644 index 00000000..5af178ff --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java @@ -0,0 +1,111 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.context.CommandContext; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; +import java.util.function.BiFunction; + +/** + * Parent of {@link Vector3dArgument} and {@link Vector2dArgument} containing shared methods. + * + *

Not for extension by API users.

+ * + * @param sender type + * @param vector type + */ +public abstract class VectorArgument extends CommandArgument { + + private final boolean centerIntegers; + + protected VectorArgument( + final boolean required, + final @NonNull String name, + final @NonNull ArgumentParser parser, + final @NonNull String defaultValue, + final @NonNull Class vectorType, + final boolean centerIntegers, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super(required, name, parser, defaultValue, vectorType, suggestionsProvider, defaultDescription); + this.centerIntegers = centerIntegers; + } + + /** + * Get whether integers will be centered to x.5. Defaults to false. + * + * @return whether integers will be centered + */ + public boolean centerIntegers() { + return this.centerIntegers; + } + + /** + * Parent class for Vector argument type builders. + * + *

Not for extension by API users.

+ * + * @param sender type + * @param vector type + * @param builder subtype + */ + public abstract static class VectorArgumentBuilder> + extends TypedBuilder { + + private boolean centerIntegers = false; + + protected VectorArgumentBuilder(final @NonNull Class vectorClass, final @NonNull String name) { + super(vectorClass, name); + } + + /** + * Set whether integers will be centered to x.5. Will be false by default if unset. + * + * @param centerIntegers whether integers will be centered + * @return this builder + */ + public @NonNull B centerIntegers(final boolean centerIntegers) { + this.centerIntegers = centerIntegers; + return this.self(); + } + + /** + * Get whether integers will be centered to x.5. Defaults to false. + * + * @return whether integers will be centered + */ + public boolean centerIntegers() { + return this.centerIntegers; + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 6d9ee107..e5bcab7e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -26,14 +26,19 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import net.minecraft.commands.arguments.DimensionArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.world.server.ServerWorld; +import java.lang.reflect.Field; import java.util.List; import java.util.Optional; import java.util.Queue; @@ -73,7 +78,21 @@ private WorldArgument( return new Builder<>(name); } - public static final class Parser implements ArgumentParser { + public static final class Parser implements NodeSupplyingArgumentParser { + + private static final DynamicCommandExceptionType ERROR_INVALID_VALUE; + + static { + try { + // todo: use an accessor + final Field errorInvalidValueField = DimensionArgument.class + .getDeclaredField("ERROR_INVALID_VALUE"); + errorInvalidValueField.setAccessible(true); + ERROR_INVALID_VALUE = (DynamicCommandExceptionType) errorInvalidValueField.get(null); + } catch (final ReflectiveOperationException ex) { + throw new RuntimeException("Couldn't access ERROR_INVALID_VALUE command exception type.", ex); + } + } @Override public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( @@ -90,7 +109,7 @@ public static final class Parser implements ArgumentParser { inputQueue.remove(); return ArgumentParseResult.success(entry.get()); } - return ArgumentParseResult.failure(new IllegalArgumentException("no such world")); // todo + return ArgumentParseResult.failure(ERROR_INVALID_VALUE.create(key)); } @Override @@ -106,6 +125,11 @@ public static final class Parser implements ArgumentParser { }).collect(Collectors.toList()); } + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode().customSuggestions(); + } + } public static final class Builder extends TypedBuilder> { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java new file mode 100644 index 00000000..2afc1e5f --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java @@ -0,0 +1,45 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.profile.GameProfile; + +import java.util.Collection; + +/** + * Cloud wrapper for a {@link Collection} of {@link GameProfile GameProfiles}. + */ +public interface GameProfileCollection { + + /** + * Get the wrapped {@link Collection} of {@link GameProfile GameProfiles}. + * + *

A successfully parsed result will always contain at least {@code 1} element.

+ * + * @return a {@link Collection} of {@link GameProfile GameProfiles} + */ + @NonNull Collection<@NonNull GameProfile> gameProfiles(); + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java index a4d36cfe..ac0c9dba 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java @@ -25,18 +25,16 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.Entity; import java.util.Collection; import java.util.Collections; - /** - * Cloud wrapper for {@link org.spongepowered.api.command.selector.Selector}. + * Cloud wrapper for parsed {@link org.spongepowered.api.command.selector.Selector Selectors} and their results. * - * @param entity subtype + * @param result type */ -public interface SelectorWrapper { +public interface SelectorWrapper { /** * Get the raw string associated with the selector. @@ -59,17 +57,17 @@ public interface SelectorWrapper { * * @return all matched entities */ - @NonNull Collection get(); + @NonNull Collection get(); /** * A specialized selector that can only return one value. * - * @param the value type + * @param the value type */ - interface Single extends SelectorWrapper { + interface Single extends SelectorWrapper { @Override - default @NonNull Collection get() { + default @NonNull Collection get() { return Collections.singletonList(this.getSingle()); } @@ -78,7 +76,7 @@ interface Single extends SelectorWrapper { * * @return the value */ - @NonNull E getSingle(); + @NonNull R getSingle(); } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 159a55de..c7f9dcaa 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -32,13 +32,19 @@ import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; +import cloud.commandframework.sponge.argument.BlockStateArgument; +import cloud.commandframework.sponge.argument.DataContainerArgument; import cloud.commandframework.sponge.argument.ItemStackSnapshotArgument; +import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; import cloud.commandframework.sponge.argument.RegistryEntryArgument; import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; +import cloud.commandframework.sponge.argument.UserArgument; import cloud.commandframework.sponge.argument.Vector3dArgument; +import cloud.commandframework.sponge.argument.Vector3iArgument; import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.MultipleEntitySelector; import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; @@ -52,16 +58,19 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; +import org.spongepowered.api.block.BlockState; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.parameter.managed.operator.Operators; import org.spongepowered.api.data.Keys; +import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.data.type.ProfessionType; import org.spongepowered.api.data.type.VillagerType; import org.spongepowered.api.effect.sound.SoundType; import org.spongepowered.api.entity.EntityType; import org.spongepowered.api.entity.EntityTypes; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.entity.living.trader.Villager; import org.spongepowered.api.item.enchantment.Enchantment; import org.spongepowered.api.item.enchantment.EnchantmentType; @@ -77,16 +86,20 @@ import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.math.vector.Vector3d; +import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.jvm.Plugin; +import java.util.Optional; import java.util.function.Function; +import static net.kyori.adventure.text.Component.newline; import static net.kyori.adventure.text.Component.space; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.BLUE; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; import static net.kyori.adventure.text.format.NamedTextColor.GREEN; +import static net.kyori.adventure.text.format.NamedTextColor.LIGHT_PURPLE; import static net.kyori.adventure.text.format.NamedTextColor.RED; import static net.kyori.adventure.text.format.TextColor.color; @@ -146,19 +159,19 @@ private void registerCommands() { .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); this.commandManager.command(cloudTest3.literal("another_test") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - final Command.Builder cloudSponge = this.commandManager.commandBuilder("cloud_sponge"); - this.commandManager.command(cloudSponge.literal("string_test") + final Command.Builder cloud = this.commandManager.commandBuilder("cloud"); + this.commandManager.command(cloud.literal("string_test") .argument(StringArgument.single("single")) .argument(StringArgument.quoted("quoted")) .argument(StringArgument.greedy("greedy")) .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloudSponge.literal("int_test") + this.commandManager.command(cloud.literal("int_test") .argument(IntegerArgument.of("any")) .argument(IntegerArgument.newBuilder("gt0").withMin(1)) .argument(IntegerArgument.newBuilder("lt100").withMax(99)) .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); - this.commandManager.command(cloudSponge.literal("enchantment_type_test") + this.commandManager.command(cloud.literal("enchantment_type_test") .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { @@ -187,7 +200,7 @@ private void registerCommands() { .build(); slot.set(modified); })); - this.commandManager.command(cloudSponge.literal("color_test") + this.commandManager.command(cloud.literal("color_test") .argument(NamedTextColorArgument.of("color")) .argument(StringArgument.greedy("message")) .handler(ctx -> { @@ -195,7 +208,7 @@ private void registerCommands() { text(ctx.get("message"), ctx.get("color")) ); })); - this.commandManager.command(cloudSponge.literal("operator_test") + this.commandManager.command(cloud.literal("operator_test") .argument(IntegerArgument.of("first")) .argument(OperatorArgument.of("operator")) .argument(IntegerArgument.of("second")) @@ -222,7 +235,7 @@ private void registerCommands() { .append(text(((Operator.Simple) operator).apply(first, second))) ); })); - this.commandManager.command(cloudSponge.literal("modifylevel") + this.commandManager.command(cloud.literal("modifylevel") .argument(OperatorArgument.of("operator")) .argument(DoubleArgument.of("value")) .handler(ctx -> { @@ -247,7 +260,7 @@ private void registerCommands() { final int currentXp = player.get(Keys.EXPERIENCE).get(); player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); })); - this.commandManager.command(cloudSponge.literal("selectplayer") + this.commandManager.command(cloud.literal("selectplayer") .argument(SinglePlayerSelectorArgument.of("player")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); @@ -256,19 +269,19 @@ private void registerCommands() { player.displayName().get() )); })); - this.commandManager.command(cloudSponge.literal("world_test") + this.commandManager.command(cloud.literal("world_test") .argument(WorldArgument.of("world")) .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("world").key().asString())); })); - this.commandManager.command(cloudSponge.literal("give_item") + this.commandManager.command(cloud.literal("give_item") .argument(SinglePlayerSelectorArgument.of("player")) .argument(ItemStackSnapshotArgument.of("item")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); player.inventory().offer(ctx.get("item").createStack()); })); - this.commandManager.command(cloudSponge.literal("test_entity_type") + this.commandManager.command(cloud.literal("test_entity_type") .argument(RegistryEntryArgument.of("type", new TypeToken>() { }, RegistryTypes.ENTITY_TYPE)) .handler(ctx -> { @@ -279,7 +292,7 @@ private void registerCommands() { .orElse(Sponge.server().worldManager().defaultWorld().location(0, 0, 0)) .world() .registries(); - this.commandManager.command(cloudSponge.literal("test_biomes") + this.commandManager.command(cloud.literal("test_biomes") .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) .handler(ctx -> { final ResourceKey biomeKey = holderFunction.apply(ctx) @@ -288,12 +301,12 @@ private void registerCommands() { .orElseThrow(IllegalStateException::new); ctx.getSender().audience().sendMessage(text(biomeKey.asString())); })); - this.commandManager.command(cloudSponge.literal("test_sounds") + this.commandManager.command(cloud.literal("test_sounds") .argument(RegistryEntryArgument.of("type", SoundType.class, RegistryTypes.SOUND_TYPE)) .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("type").key().asString())); })); - this.commandManager.command(cloudSponge.literal("summon_villager") + this.commandManager.command(cloud.literal("summon_villager") .argument(RegistryEntryArgument.of("type", VillagerType.class, RegistryTypes.VILLAGER_TYPE)) .argument(RegistryEntryArgument.of("profession", ProfessionType.class, RegistryTypes.PROFESSION_TYPE)) .handler(ctx -> { @@ -316,11 +329,50 @@ private void registerCommands() { ctx.getSender().audience().sendMessage(text("failed to spawn :(")); } })); - this.commandManager.command(cloudSponge.literal("vec3d") + this.commandManager.command(cloud.literal("vec3d") .argument(Vector3dArgument.of("vec3d")) .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("vec3d").toString())); })); + this.commandManager.command(cloud.literal("selectentities") + .argument(MultipleEntitySelectorArgument.of("selector")) + .handler(ctx -> { + final MultipleEntitySelector selector = ctx.get("selector"); + ctx.getSender().audience().sendMessage(TextComponent.ofChildren( + text("Using selector: ", BLUE), + text(selector.inputString()), + newline(), + text("Selected: ", LIGHT_PURPLE), + selector.get().stream() + .map(e -> e.displayName().get()) + .collect(Component.toComponent(text(", ", GRAY))) + )); + })); + + this.commandManager.command(cloud.literal("user") + .argument(UserArgument.of("user")) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(text(ctx.get("user").toString())); + })); + this.commandManager.command(cloud.literal("data") + .argument(DataContainerArgument.of("data")) + .handler(ctx -> { + ctx.getSender().audience().sendMessage(text(ctx.get("data").toString())); + })); + this.commandManager.command(cloud.literal("setblock") + .argument(Vector3iArgument.of("position")) + .argument(BlockStateArgument.of("blockstate")) + .handler(ctx -> { + final Vector3i position = ctx.get("position"); + final BlockState blockState = ctx.get("blockstate"); + final Optional location = ctx.getSender().location(); + if (location.isPresent()) { + location.get().world().setBlock(position, blockState); + ctx.getSender().audience().sendMessage(text("set block!")); + } else { + ctx.getSender().audience().sendMessage(text("no location!")); + } + })); } } From 1388e23e49aef1454b51d06b861dd258ec4b45c1 Mon Sep 17 00:00:00 2001 From: jmp Date: Mon, 26 Apr 2021 14:38:02 -0700 Subject: [PATCH 14/72] sponge: More Javadoc --- .../sponge/argument/GameProfileArgument.java | 2 +- .../sponge/argument/OperatorArgument.java | 90 +++++- .../argument/RegistryEntryArgument.java | 293 +++++++++++++++++- .../sponge/argument/ResourceKeyArgument.java | 62 ++++ .../sponge/argument/WorldArgument.java | 11 + 5 files changed, 454 insertions(+), 4 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index fcfecc39..2dc7d102 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -92,7 +92,7 @@ public static final class Parser implements NodeSupplyingArgumentParser 1) { - return ArgumentParseResult.failure(new IllegalArgumentException("too many profiles")); + return ArgumentParseResult.failure(new IllegalArgumentException("too many profiles")); // todo } final GameProfile profile = SpongeGameProfile.of(profiles.iterator().next()); return ArgumentParseResult.success(profile); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 19795277..82584dce 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -35,6 +35,7 @@ import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.RegistryTypes; import java.lang.reflect.Field; @@ -43,6 +44,11 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * An argument for parsing {@link Operator Operators}. + * + * @param sender type + */ public final class OperatorArgument extends CommandArgument { private OperatorArgument( @@ -63,18 +69,71 @@ private OperatorArgument( ); } + /** + * Create a new required {@link OperatorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link OperatorArgument} + */ + public static @NonNull OperatorArgument of(final @NonNull String name) { + return OperatorArgument.builder(name).build(); + } + + /** + * Create a new optional {@link OperatorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link OperatorArgument} + */ public static @NonNull OperatorArgument optional(final @NonNull String name) { return OperatorArgument.builder(name).asOptional().build(); } - public static @NonNull OperatorArgument of(final @NonNull String name) { - return OperatorArgument.builder(name).build(); + /** + * Create a new optional {@link OperatorArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link OperatorArgument} + */ + public static @NonNull OperatorArgument optional(final @NonNull String name, final @NonNull Operator defaultValue) { + return OperatorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link OperatorArgument} with the specified default value. + * + * @param name argument name + * @param sender type + * @param defaultValue default value + * @return a new {@link OperatorArgument} + */ + public static @NonNull OperatorArgument optional( + final @NonNull String name, + final @NonNull DefaultedRegistryReference defaultValue + ) { + return OperatorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Argument parser for {@link Operator Operators}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private static final SimpleCommandExceptionType ERROR_INVALID_OPERATION; @@ -114,6 +173,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -131,6 +195,28 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull Operator defaultValue) { + return this.asOptionalWithDefault(defaultValue.asString()); + } + + /** + * Sets the command argument to be optional, with the provided default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { + return this.asOptionalWithDefault(defaultValue.get().asString()); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index f81f6475..33538870 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -42,6 +42,7 @@ import org.spongepowered.api.registry.Registry; import org.spongepowered.api.registry.RegistryEntry; import org.spongepowered.api.registry.RegistryHolder; +import org.spongepowered.api.registry.RegistryReference; import org.spongepowered.api.registry.RegistryType; import org.spongepowered.api.registry.RegistryTypes; @@ -53,6 +54,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +/** + * An argument for retrieving values from any of Sponge's {@link Registry Registries}. + * + * @param sender type + * @param value type + */ public final class RegistryEntryArgument extends CommandArgument { // todo: should we return a RegistryEntry? private RegistryEntryArgument( @@ -78,6 +85,16 @@ private RegistryEntryArgument( // Start DefaultedRegistryType methods + /** + * Create a new required {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument of( final @NonNull String name, final @NonNull TypeToken valueType, @@ -86,6 +103,16 @@ private RegistryEntryArgument( return RegistryEntryArgument.builder(name, valueType, registryType).build(); } + /** + * Create a new required {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument of( final @NonNull String name, final @NonNull Class valueType, @@ -94,6 +121,16 @@ private RegistryEntryArgument( return of(name, TypeToken.get(valueType), registryType); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument optional( final @NonNull String name, final @NonNull TypeToken valueType, @@ -102,6 +139,16 @@ private RegistryEntryArgument( return RegistryEntryArgument.builder(name, valueType, registryType).asOptional().build(); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument optional( final @NonNull String name, final @NonNull Class valueType, @@ -110,6 +157,59 @@ private RegistryEntryArgument( return optional(name, TypeToken.get(valueType), registryType); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}, + * with the specified default value. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param defaultValue default value + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull DefaultedRegistryType registryType, + final @NonNull RegistryReference defaultValue + ) { + return RegistryEntryArgument.builder(name, valueType, registryType) + .asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}, + * with the specified default value. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param defaultValue default value + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull DefaultedRegistryType registryType, + final @NonNull RegistryReference defaultValue + ) { + return optional(name, TypeToken.get(valueType), registryType, defaultValue); + } + + /** + * Create a new {@link Builder} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link Builder} + */ public static @NonNull Builder builder( final @NonNull String name, final @NonNull TypeToken valueType, @@ -118,6 +218,16 @@ private RegistryEntryArgument( return new Builder<>(name, valueType, ctx -> registryType.defaultHolder().get(), registryType); } + /** + * Create a new {@link Builder} for a {@link DefaultedRegistryType}. + * + * @param name argument name + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link Builder} + */ public static @NonNull Builder builder( final @NonNull String name, final @NonNull Class valueType, @@ -130,6 +240,21 @@ private RegistryEntryArgument( // Start RegistryType methods + /** + * Create a new required {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #of(String, TypeToken, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument of( final @NonNull String name, final @NonNull TypeToken valueType, @@ -139,6 +264,21 @@ private RegistryEntryArgument( return RegistryEntryArgument.builder(name, valueType, holderSupplier, registryType).build(); } + /** + * Create a new required {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #of(String, Class, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument of( final @NonNull String name, final @NonNull Class valueType, @@ -148,6 +288,21 @@ private RegistryEntryArgument( return of(name, TypeToken.get(valueType), holderSupplier, registryType); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #optional(String, TypeToken, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument optional( final @NonNull String name, final @NonNull TypeToken valueType, @@ -157,6 +312,21 @@ private RegistryEntryArgument( return builder(name, valueType, holderSupplier, registryType).asOptional().build(); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #optional(String, Class, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ public static @NonNull RegistryEntryArgument optional( final @NonNull String name, final @NonNull Class valueType, @@ -166,6 +336,72 @@ private RegistryEntryArgument( return optional(name, TypeToken.get(valueType), holderSupplier, registryType); } + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function and default value. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #optional(String, Class, DefaultedRegistryType, RegistryReference)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param defaultValue default value + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull Class valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType, + final @NonNull RegistryReference defaultValue + ) { + return optional(name, TypeToken.get(valueType), holderSupplier, registryType, defaultValue); + } + + /** + * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function and default value. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #optional(String, TypeToken, DefaultedRegistryType, RegistryReference)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param defaultValue default value + * @param sender type + * @param value type + * @return a new {@link RegistryEntryArgument} + */ + public static @NonNull RegistryEntryArgument optional( + final @NonNull String name, + final @NonNull TypeToken valueType, + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType, + final @NonNull RegistryReference defaultValue + ) { + return builder(name, valueType, holderSupplier, registryType).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new {@link Builder} using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #builder(String, TypeToken, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link Builder} + */ public static @NonNull Builder builder( final @NonNull String name, final @NonNull TypeToken valueType, @@ -175,6 +411,20 @@ private RegistryEntryArgument( return new Builder<>(name, valueType, holderSupplier, registryType); } + /** + * Create a new {@link Builder} using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #builder(String, Class, DefaultedRegistryType)}.

+ * + * @param name argument name + * @param valueType value type + * @param holderSupplier registry holder function + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link Builder} + */ public static @NonNull Builder builder( final @NonNull String name, final @NonNull Class valueType, @@ -186,12 +436,26 @@ private RegistryEntryArgument( // End RegistryType methods + /** + * An argument parser for values in a {@link Registry}. + * + * @param sender type + * @param value type + */ public static final class Parser implements NodeSupplyingArgumentParser { - private final Function, RegistryHolder> holderSupplier; private final RegistryType registryType; + /** + * Create a new {@link Parser} using the specified {@link RegistryHolder} function. + * + *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #Parser(DefaultedRegistryType)}.

+ * + * @param holderSupplier registry holder function + * @param registryType registry type + */ public Parser( final @NonNull Function, RegistryHolder> holderSupplier, final @NonNull RegistryType registryType @@ -200,6 +464,11 @@ public Parser( this.registryType = registryType; } + /** + * Create a new {@link Parser}. + * + * @param registryType defaulted registry type + */ public Parser(final @NonNull DefaultedRegistryType registryType) { this(ctx -> registryType.defaultHolder().get(), registryType); } @@ -299,6 +568,28 @@ public static final class Builder extends TypedBuilder ); } + /** + * Sets the command argument to be optional, with the provided default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { + return this.asOptionalWithDefault(defaultValue.asString()); + } + + /** + * Sets the command argument to be optional, with the provided default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull RegistryReference defaultValue) { + return this.asOptionalWithDefault(defaultValue.location()); + } + } /** diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java index 7fcb8069..c1b0363d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -38,6 +38,11 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link ResourceKey ResourceKeys}. + * + * @param sender type + */ public final class ResourceKeyArgument extends CommandArgument { private ResourceKeyArgument( @@ -58,18 +63,59 @@ private ResourceKeyArgument( ); } + /** + * Create a new optional {@link ResourceKeyArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ResourceKeyArgument} + */ public static @NonNull ResourceKeyArgument optional(final @NonNull String name) { return ResourceKeyArgument.builder(name).asOptional().build(); } + /** + * Create a new optional {@link ResourceKeyArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ResourceKeyArgument} + */ + public static @NonNull ResourceKeyArgument optional( + final @NonNull String name, + final @NonNull ResourceKey defaultValue + ) { + return ResourceKeyArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new required {@link ResourceKeyArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ResourceKeyArgument} + */ public static @NonNull ResourceKeyArgument of(final @NonNull String name) { return ResourceKeyArgument.builder(name).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Argument parser for {@link ResourceKey ResourceKey}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { @Override @@ -93,6 +139,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -110,6 +161,17 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { + return this.asOptionalWithDefault(defaultValue.asString()); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index e5bcab7e..75ab4576 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -149,6 +149,17 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { + return this.asOptionalWithDefault(defaultValue.asString()); + } + } } From a63bcb8a79f657b3bf4044bd5293522543542571 Mon Sep 17 00:00:00 2001 From: jmp Date: Mon, 26 Apr 2021 14:39:25 -0700 Subject: [PATCH 15/72] sponge: Properly translate node requirements and executable status --- .../sponge/CloudSpongeCommand.java | 79 +++++++++++++++++-- .../examples/sponge/CloudExamplePlugin.java | 1 + 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index edfd74a7..18636800 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -32,6 +32,8 @@ import cloud.commandframework.exceptions.InvalidSyntaxException; import cloud.commandframework.exceptions.NoPermissionException; import cloud.commandframework.exceptions.NoSuchCommandException; +import cloud.commandframework.permission.CommandPermission; +import cloud.commandframework.permission.Permission; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; @@ -47,6 +49,8 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CompletionException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; @@ -165,8 +169,51 @@ public List suggestions(final @NonNull CommandCause cause, final Argumen @Override public boolean canExecute(final @NonNull CommandCause cause) { - // todo: check if there are any nodes we can execute - return true; + final C sender = this.commandManager.backwardsCauseMapper().apply(cause); + // check whether there are any commands we can execute + final AtomicBoolean result = new AtomicBoolean(false); + visit(this.commandManager.getCommandTree().getNamedNode(this.label), node -> { + if (node.getValue().getOwningCommand() == null) { + return VisitAction.CONTINUE; + } + final boolean permitted = this.commandManager.hasPermission( + sender, + node.getValue().getOwningCommand().getCommandPermission() + ); + if (permitted) { + result.set(true); + return VisitAction.END; + } + return VisitAction.CONTINUE; + }); + return result.get(); + } + + private static void visit( + final CommandTree.Node> node, + final Function>, VisitAction> visitor + ) { + visitImpl(node, visitor); + } + + private static VisitAction visitImpl( + final CommandTree.Node> node, + final Function>, VisitAction> visitor + ) { + if (visitor.apply(node) == VisitAction.END) { + return VisitAction.END; + } + for (final CommandTree.Node> child : node.getChildren()) { + if (visitImpl(child, visitor) == VisitAction.END) { + break; + } + } + return VisitAction.END; + } + + private enum VisitAction { + CONTINUE, + END } @Override @@ -205,20 +252,40 @@ public CommandTreeNode.Root commandTree() { this.addChildren(root, cloud); - return root.executable(); + if (cloud.isLeaf() || cloud.getValue().getOwningCommand() != null) { + root.executable(); + } + + return (CommandTreeNode.Root) root; } private void addChildren(final CommandTreeNode node, final CommandTree.Node> cloud) { for (final CommandTree.Node> child : cloud.getChildren()) { final CommandArgument value = child.getValue(); - final CommandTreeNode> treeNode; + final CommandTreeNode.Argument> treeNode; if (value instanceof StaticArgument) { - treeNode = CommandTreeNode.literal(); + treeNode = (CommandTreeNode.Argument>) CommandTreeNode.literal(); } else { treeNode = this.commandManager.parserMapper().toSponge(value); } + final CommandPermission permission = (CommandPermission) child.getNodeMeta().getOrDefault( + "permission", + Permission.empty() + ); + if (permission != Permission.empty()) { + treeNode.requires(cause -> this.commandManager.hasPermission( + this.commandManager.backwardsCauseMapper().apply(cause), + permission + )); + } + if (child.isLeaf() + || !child.getValue().isRequired() + || child.getValue().getOwningCommand() != null + || child.getChildren().stream().noneMatch(c -> c.getValue().isRequired())) { + treeNode.executable(); + } this.addChildren(treeNode, child); - node.child(value.getName(), treeNode.executable()); + node.child(value.getName(), treeNode); } } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index c7f9dcaa..d64dd0e7 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -360,6 +360,7 @@ private void registerCommands() { ctx.getSender().audience().sendMessage(text(ctx.get("data").toString())); })); this.commandManager.command(cloud.literal("setblock") + .permission("cloud.setblock") .argument(Vector3iArgument.of("position")) .argument(BlockStateArgument.of("blockstate")) .handler(ctx -> { From 232cfede53e220ce0431427848af36c93f6136fe Mon Sep 17 00:00:00 2001 From: jmp Date: Mon, 26 Apr 2021 15:10:58 -0700 Subject: [PATCH 16/72] sponge: Also set requirements on root nodes --- .../sponge/CloudSpongeCommand.java | 32 ++++++++++++------- .../examples/sponge/CloudExamplePlugin.java | 1 + 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 18636800..fdd30ee2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -250,12 +250,13 @@ public CommandTreeNode.Root commandTree() { .getCommandTree() .getNamedNode(this.label); - this.addChildren(root, cloud); - if (cloud.isLeaf() || cloud.getValue().getOwningCommand() != null) { root.executable(); } + this.addRequirement(cloud, root); + + this.addChildren(root, cloud); return (CommandTreeNode.Root) root; } @@ -268,16 +269,7 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node this.commandManager.hasPermission( - this.commandManager.backwardsCauseMapper().apply(cause), - permission - )); - } + this.addRequirement(child, treeNode); if (child.isLeaf() || !child.getValue().isRequired() || child.getValue().getOwningCommand() != null @@ -289,6 +281,22 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node> cloud, + final @NonNull CommandTreeNode> node + ) { + final CommandPermission permission = (CommandPermission) cloud.getNodeMeta().getOrDefault( + "permission", + Permission.empty() + ); + if (permission != Permission.empty()) { + node.requires(cause -> this.commandManager.hasPermission( + this.commandManager.backwardsCauseMapper().apply(cause), + permission + )); + } + } + private String formatCommandForParsing(final @NonNull String arguments) { if (arguments.isEmpty()) { return this.label; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index d64dd0e7..e6aa07af 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -145,6 +145,7 @@ public CloudExamplePlugin(final @NonNull Injector injector) { private void registerCommands() { this.commandManager.command(this.commandManager.commandBuilder("cloud_test1") + .permission("cloud.test1") .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("cloud_test2") .literal("test") From 93528ae3039fb0a60485250d42dce4aa5edda6a4 Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 27 Apr 2021 01:53:07 -0700 Subject: [PATCH 17/72] sponge: More Javadoc --- .../sponge/SpongeCaptionKeys.java | 7 + .../sponge/SpongeCaptionRegistry.java | 10 ++ .../sponge/SpongeCommandManager.java | 33 +++- .../sponge/argument/BlockStateArgument.java | 131 ++++++++++++++- .../sponge/argument/ComponentArgument.java | 67 +++++++- .../argument/DataContainerArgument.java | 67 +++++++- .../sponge/argument/GameProfileArgument.java | 66 +++++++- .../GameProfileCollectionArgument.java | 47 +++++- .../argument/ItemStackSnapshotArgument.java | 159 +++++++++++++++++- .../MultipleEntitySelectorArgument.java | 46 ++++- .../MultiplePlayerSelectorArgument.java | 46 ++++- .../argument/NamedTextColorArgument.java | 67 +++++++- .../sponge/argument/OperatorArgument.java | 4 +- .../argument/RegistryEntryArgument.java | 4 +- .../sponge/argument/ResourceKeyArgument.java | 2 +- .../SingleEntitySelectorArgument.java | 46 ++++- .../SinglePlayerSelectorArgument.java | 46 ++++- .../sponge/argument/UserArgument.java | 51 +++++- .../sponge/argument/Vector2dArgument.java | 92 ++++++++++ .../sponge/argument/Vector2iArgument.java | 59 ++++++- .../sponge/argument/Vector3dArgument.java | 87 +++++++++- .../sponge/argument/Vector3iArgument.java | 58 ++++++- .../sponge/argument/VectorArgument.java | 2 +- .../sponge/argument/WorldArgument.java | 55 +++++- .../sponge/argument/package-info.java | 2 +- .../sponge/data/MultipleEntitySelector.java | 2 +- .../sponge/data/MultiplePlayerSelector.java | 3 +- .../sponge/data/SingleEntitySelector.java | 4 +- .../sponge/data/SinglePlayerSelector.java | 3 +- .../sponge/data/package-info.java | 2 +- .../examples/sponge/CloudExamplePlugin.java | 10 ++ 31 files changed, 1198 insertions(+), 80 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index 8e3cbf88..a5242972 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -66,6 +66,13 @@ public final class SpongeCaptionKeys { "argument.parse.failure.user.invalid_input" ); + /** + * Variables: None + */ + public static final Caption ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED = of( + "argument.parse.failure.game_profile.too_many_selected" + ); + private SpongeCaptionKeys() { } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index 7de9e361..8b880fc0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -57,6 +57,12 @@ public class SpongeCaptionRegistry extends SimpleCaptionRegistry { public static final String ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT = "Input '{input}' is not a valid UUID or username."; + /** + * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED} + */ + public static final String ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED = + "The provided selector matched multiple game profiles, but only one is allowed."; + protected SpongeCaptionRegistry() { super(); @@ -76,6 +82,10 @@ protected SpongeCaptionRegistry() { SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT, (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT ); + this.registerMessageFactory( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED + ); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 4c38496e..16dd70e4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -67,9 +67,11 @@ import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.registry.DefaultedRegistryType; +import org.spongepowered.api.registry.Registry; import org.spongepowered.api.registry.RegistryType; import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.world.server.ServerWorld; @@ -82,7 +84,9 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.HashSet; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -299,7 +303,34 @@ public boolean hasPermission( } void registrationCalled() { - this.lockRegistration(); + if (!this.registrationCallbackListeners.isEmpty()) { + this.registrationCallbackListeners.forEach(listener -> listener.accept(this)); + this.registrationCallbackListeners.clear(); + } + if (this.getRegistrationState() != RegistrationState.AFTER_REGISTRATION) { + this.lockRegistration(); + } + } + + private final Set>> registrationCallbackListeners = new HashSet<>(); + + /** + * Add a listener to the command registration callback. + * + *

These listeners will be called just before command registration is finalized + * (during the first invocation of Cloud's internal {@link RegisterCommandEvent} listener).

+ * + *

This allows for registering commands at the latest possible point in the plugin + * lifecycle, which may be necessary for certain {@link Registry Registries} to have + * initialized.

+ * + * @param listener listener + */ + public void addRegistrationCallbackListener(final @NonNull Consumer<@NonNull SpongeCommandManager> listener) { + if (this.getRegistrationState() == RegistrationState.AFTER_REGISTRATION) { + throw new IllegalStateException("The SpongeCommandManager is in the AFTER_REGISTRATION state!"); + } + this.registrationCallbackListeners.add(listener); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java index b295ee56..209e756e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java @@ -34,13 +34,30 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.registry.DefaultedRegistryReference; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.schematic.PaletteTypes; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; +/** + * An argument for parsing {@link BlockState BlockStates} from a {@link BlockType} identifier + * and optional extra properties. + * + *

Example input strings:

+ *
    + *
  • {@code stone}
  • + *
  • {@code minecraft:stone}
  • + *
  • {@code andesite_stairs[waterlogged=true,facing=east]}
  • + *
+ * + * @param sender type + */ public final class BlockStateArgument extends CommandArgument { private BlockStateArgument( @@ -61,18 +78,89 @@ private BlockStateArgument( ); } + /** + * Create a new required {@link BlockStateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link BlockStateArgument} + */ + public static @NonNull BlockStateArgument of(final @NonNull String name) { + return BlockStateArgument.builder(name).build(); + } + + /** + * Create a new optional {@link BlockStateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link BlockStateArgument} + */ public static @NonNull BlockStateArgument optional(final @NonNull String name) { return BlockStateArgument.builder(name).asOptional().build(); } - public static @NonNull BlockStateArgument of(final @NonNull String name) { - return BlockStateArgument.builder(name).build(); + /** + * Create a new optional {@link BlockStateArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link BlockStateArgument} + */ + public static @NonNull BlockStateArgument optional( + final @NonNull String name, + final @NonNull BlockState defaultValue + ) { + return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link BlockStateArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link BlockStateArgument} + */ + public static @NonNull BlockStateArgument optional( + final @NonNull String name, + final @NonNull BlockType defaultValue + ) { + return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link BlockStateArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link BlockStateArgument} + */ + public static @NonNull BlockStateArgument optional( + final @NonNull String name, + final @NonNull DefaultedRegistryReference defaultValue + ) { + return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link BlockState BlockStates}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -94,6 +182,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -111,6 +204,40 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull BlockState defaultValue) { + return this.asOptionalWithDefault(PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() + .apply(RegistryTypes.BLOCK_TYPE.get(), defaultValue)); + } + + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull BlockType defaultValue) { + return this.asOptionalWithDefault(defaultValue.defaultState()); + } + + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { + return this.asOptionalWithDefault(defaultValue.get()); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java index 492e502c..c547cdd9 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -31,6 +31,7 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; @@ -41,6 +42,11 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * An argument for parsing {@link Component Components} from json formatted text. + * + * @param sender type + */ public final class ComponentArgument extends CommandArgument { private ComponentArgument( @@ -61,18 +67,59 @@ private ComponentArgument( ); } + /** + * Create a new required {@link ComponentArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ComponentArgument} + */ + public static @NonNull ComponentArgument of(final @NonNull String name) { + return ComponentArgument.builder(name).build(); + } + + /** + * Create a new optional {@link ComponentArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ComponentArgument} + */ public static @NonNull ComponentArgument optional(final @NonNull String name) { return ComponentArgument.builder(name).asOptional().build(); } - public static @NonNull ComponentArgument of(final @NonNull String name) { - return ComponentArgument.builder(name).build(); + /** + * Create a new optional {@link ComponentArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ComponentArgument} + */ + public static @NonNull ComponentArgument optional( + final @NonNull String name, + final @NonNull ComponentLike defaultValue + ) { + return ComponentArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link Component Components} from json formatted text. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -96,6 +143,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -113,6 +165,17 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull ComponentLike defaultValue) { + return this.asOptionalWithDefault(SpongeAdventure.json(defaultValue.asComponent())); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java index 8ca1080e..0c5eae28 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java @@ -43,6 +43,12 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link DataContainer DataContainers} from + *
SNBT strings. + * + * @param sender type + */ public final class DataContainerArgument extends CommandArgument { private DataContainerArgument( @@ -63,18 +69,59 @@ private DataContainerArgument( ); } + /** + * Create a new required {@link DataContainerArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link DataContainerArgument} + */ + public static @NonNull DataContainerArgument of(final @NonNull String name) { + return DataContainerArgument.builder(name).build(); + } + + /** + * Create a new optional {@link DataContainerArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link DataContainerArgument} + */ public static @NonNull DataContainerArgument optional(final @NonNull String name) { return DataContainerArgument.builder(name).asOptional().build(); } - public static @NonNull DataContainerArgument of(final @NonNull String name) { - return DataContainerArgument.builder(name).build(); + /** + * Create a new optional {@link DataContainerArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link DataContainerArgument} + */ + public static @NonNull DataContainerArgument optional( + final @NonNull String name, + final @NonNull DataContainer defaultValue + ) { + return DataContainerArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link DataContainer DataContainers} from SNBT. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -97,6 +144,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -114,6 +166,17 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull DataContainer defaultValue) { + return this.asOptionalWithDefault(NBTTranslator.INSTANCE.translate(defaultValue).toString()); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index 2dc7d102..11e81781 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -29,7 +29,9 @@ import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; +import cloud.commandframework.exceptions.parsing.ParserException; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCaptionKeys; import cloud.commandframework.sponge.SpongeCommandContextKeys; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; @@ -37,6 +39,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; @@ -45,6 +48,11 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing a single {@link GameProfile} from a {@link Selector}. + * + * @param sender type + */ public final class GameProfileArgument extends CommandArgument { private GameProfileArgument( @@ -65,18 +73,44 @@ private GameProfileArgument( ); } - public static @NonNull GameProfileArgument optional(final @NonNull String name) { - return GameProfileArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link GameProfileArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link GameProfileArgument} + */ public static @NonNull GameProfileArgument of(final @NonNull String name) { return GameProfileArgument.builder(name).build(); } + /** + * Create a new optional {@link GameProfileArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link GameProfileArgument} + */ + public static @NonNull GameProfileArgument optional(final @NonNull String name) { + return GameProfileArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Create a new parser for a single {@link GameProfile}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -92,7 +126,7 @@ public static final class Parser implements NodeSupplyingArgumentParser 1) { - return ArgumentParseResult.failure(new IllegalArgumentException("too many profiles")); // todo + return ArgumentParseResult.failure(new TooManyGameProfilesSelectedException(ctx)); } final GameProfile profile = SpongeGameProfile.of(profiles.iterator().next()); return ArgumentParseResult.success(profile); @@ -113,6 +147,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -132,4 +171,21 @@ public static final class Builder extends TypedBuilder context) { + super( + Parser.class, + context, + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED + ); + } + + } + } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index 18f66433..59472310 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -38,6 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; @@ -48,6 +49,12 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +/** + * Argument for parsing a {@link Collection} of {@link GameProfile GameProfiles} from a + * {@link Selector}. A successfully parsed result will contain at least one element. + * + * @param sender type + */ public final class GameProfileCollectionArgument extends CommandArgument { private GameProfileCollectionArgument( @@ -68,18 +75,45 @@ private GameProfileCollectionArgument( ); } - public static @NonNull GameProfileCollectionArgument optional(final @NonNull String name) { - return GameProfileCollectionArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link GameProfileArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link GameProfileArgument} + */ public static @NonNull GameProfileCollectionArgument of(final @NonNull String name) { return GameProfileCollectionArgument.builder(name).build(); } + /** + * Create a new optional {@link GameProfileArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link GameProfileArgument} + */ + public static @NonNull GameProfileCollectionArgument optional(final @NonNull String name) { + return GameProfileCollectionArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for a {@link Collection} of {@link GameProfile GameProfiles}. A successfully parsed result will + * contain at least one element. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -119,6 +153,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java index 7d5cdb99..a739d049 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java @@ -37,13 +37,30 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.item.inventory.ItemStackSnapshot; +import org.spongepowered.api.registry.DefaultedRegistryReference; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; +/** + * An argument for parsing {@link ItemStackSnapshot ItemStackSnapshots} from a {@link ItemType} identifier + * and optional NBT data. + * + *

Resulting snapshots will always have a stack size of {@code 1}.

+ * + *

Example input strings:

+ *
    + *
  • {@code apple}
  • + *
  • {@code minecraft:apple}
  • + *
  • {@code diamond_sword{Enchantments:[{id:sharpness,lvl:5}]}}
  • + *
+ * + * @param sender type + */ public final class ItemStackSnapshotArgument extends CommandArgument { private ItemStackSnapshotArgument( @@ -64,18 +81,105 @@ private ItemStackSnapshotArgument( ); } + /** + * Create a new required {@link ItemStackSnapshotArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ + public static @NonNull ItemStackSnapshotArgument of(final @NonNull String name) { + return ItemStackSnapshotArgument.builder(name).build(); + } + + /** + * Create a new optional {@link ItemStackSnapshotArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ public static @NonNull ItemStackSnapshotArgument optional(final @NonNull String name) { return ItemStackSnapshotArgument.builder(name).asOptional().build(); } - public static @NonNull ItemStackSnapshotArgument of(final @NonNull String name) { - return ItemStackSnapshotArgument.builder(name).build(); + /** + * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ + public static @NonNull ItemStackSnapshotArgument optional( + final @NonNull String name, + final @NonNull ItemStackSnapshot defaultValue + ) { + return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ + public static @NonNull ItemStackSnapshotArgument optional( + final @NonNull String name, + final @NonNull ItemStack defaultValue + ) { + return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ + public static @NonNull ItemStackSnapshotArgument optional( + final @NonNull String name, + final @NonNull ItemType defaultValue + ) { + return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link ItemStackSnapshotArgument} + */ + public static @NonNull ItemStackSnapshotArgument optional( + final @NonNull String name, + final @NonNull DefaultedRegistryReference defaultValue + ) { + return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link ItemStackSnapshot ItemStackSnapshots} from an {@link ItemType} identifier and + * optional NBT data. The stack size of the resulting snapshot will always be {@code 1}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -104,6 +208,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -121,6 +230,52 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull ItemType defaultValue) { + return this.asOptionalWithDefault(ItemStack.of(defaultValue)); + } + + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { + return this.asOptionalWithDefault(defaultValue.get()); + } + + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + public @NonNull Builder asOptionalWithDefault(final @NonNull ItemStackSnapshot defaultValue) { + return this.asOptionalWithDefault(defaultValue.createStack()); + } + + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + */ + @SuppressWarnings("ConstantConditions") + public @NonNull Builder asOptionalWithDefault(final @NonNull ItemStack defaultValue) { + final net.minecraft.world.item.ItemStack stack = (net.minecraft.world.item.ItemStack) (Object) defaultValue; + return this.asOptionalWithDefault(new ItemInput(stack.getItem(), stack.getTag()).serialize()); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 63945343..89c80dcb 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -49,6 +49,11 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +/** + * Argument for selecting one or more {@link Entity Entities} using a {@link Selector}. + * + * @param sender type + */ public final class MultipleEntitySelectorArgument extends CommandArgument { private MultipleEntitySelectorArgument( @@ -69,21 +74,47 @@ private MultipleEntitySelectorArgument( ); } - public static @NonNull MultipleEntitySelectorArgument optional(final @NonNull String name) { - return MultipleEntitySelectorArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link MultipleEntitySelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link MultipleEntitySelectorArgument} + */ public static @NonNull MultipleEntitySelectorArgument of(final @NonNull String name) { return MultipleEntitySelectorArgument.builder(name).build(); } + /** + * Create a new optional {@link MultipleEntitySelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link MultipleEntitySelectorArgument} + */ + public static @NonNull MultipleEntitySelectorArgument optional(final @NonNull String name) { + return MultipleEntitySelectorArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link MultipleEntitySelector}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { - final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entities()); + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entities()); @Override public @NonNull ArgumentParseResult<@NonNull MultipleEntitySelector> parse( @@ -117,6 +148,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index 732b4ba0..571fd25f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -49,6 +49,11 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +/** + * Argument for selecting one or more {@link Player Players} using a {@link Selector}. + * + * @param sender type + */ public final class MultiplePlayerSelectorArgument extends CommandArgument { private MultiplePlayerSelectorArgument( @@ -69,21 +74,47 @@ private MultiplePlayerSelectorArgument( ); } - public static @NonNull MultiplePlayerSelectorArgument optional(final @NonNull String name) { - return MultiplePlayerSelectorArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link MultiplePlayerSelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a bew {@link MultiplePlayerSelectorArgument} + */ public static @NonNull MultiplePlayerSelectorArgument of(final @NonNull String name) { return MultiplePlayerSelectorArgument.builder(name).build(); } + /** + * Create a new optional {@link MultiplePlayerSelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a bew {@link MultiplePlayerSelectorArgument} + */ + public static @NonNull MultiplePlayerSelectorArgument optional(final @NonNull String name) { + return MultiplePlayerSelectorArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link MultiplePlayerSelector}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { - final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.players()); + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.players()); @Override public @NonNull ArgumentParseResult<@NonNull MultiplePlayerSelector> parse( @@ -117,6 +148,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index 7753d773..66afeb41 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -38,10 +38,16 @@ import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Optional; import java.util.Queue; import java.util.function.BiFunction; +/** + * An argument for parsing {@link NamedTextColor NamedTextColors}. + * + * @param sender type + */ public final class NamedTextColorArgument extends CommandArgument { private NamedTextColorArgument( @@ -62,18 +68,59 @@ private NamedTextColorArgument( ); } + /** + * Create a new required {@link NamedTextColorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link NamedTextColorArgument} + */ + public static @NonNull NamedTextColorArgument of(final @NonNull String name) { + return NamedTextColorArgument.builder(name).build(); + } + + /** + * Create a new optional {@link NamedTextColorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link NamedTextColorArgument} + */ public static @NonNull NamedTextColorArgument optional(final @NonNull String name) { return NamedTextColorArgument.builder(name).asOptional().build(); } - public static @NonNull NamedTextColorArgument of(final @NonNull String name) { - return NamedTextColorArgument.builder(name).build(); + /** + * Create a new optional {@link NamedTextColorArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link NamedTextColorArgument} + */ + public static @NonNull NamedTextColorArgument optional( + final @NonNull String name, + final @NonNull NamedTextColor defaultValue + ) { + return NamedTextColorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link NamedTextColor}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { @Override @@ -100,6 +147,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -117,6 +169,17 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull NamedTextColor defaultValue) { + return this.asOptionalWithDefault(Objects.requireNonNull(NamedTextColor.NAMES.key(defaultValue))); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 82584dce..ea8f34b7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -196,7 +196,7 @@ public static final class Builder extends TypedBuilder extends TypedBuilder extends TypedBuilder } /** - * Sets the command argument to be optional, with the provided default value. + * Sets the command argument to be optional, with the specified default value. * * @param defaultValue default value * @return this builder @@ -580,7 +580,7 @@ public static final class Builder extends TypedBuilder } /** - * Sets the command argument to be optional, with the provided default value. + * Sets the command argument to be optional, with the specified default value. * * @param defaultValue default value * @return this builder diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java index c1b0363d..2a745107 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -162,7 +162,7 @@ public static final class Builder extends TypedBuilder sender type + */ public final class SingleEntitySelectorArgument extends CommandArgument { private SingleEntitySelectorArgument( @@ -67,21 +72,47 @@ private SingleEntitySelectorArgument( ); } - public static @NonNull SingleEntitySelectorArgument optional(final @NonNull String name) { - return SingleEntitySelectorArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link SingleEntitySelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link SingleEntitySelectorArgument} + */ public static @NonNull SingleEntitySelectorArgument of(final @NonNull String name) { return SingleEntitySelectorArgument.builder(name).build(); } + /** + * Create a new optional {@link SingleEntitySelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link SingleEntitySelectorArgument} + */ + public static @NonNull SingleEntitySelectorArgument optional(final @NonNull String name) { + return SingleEntitySelectorArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link SingleEntitySelector}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { - final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entity()); + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entity()); @Override public @NonNull ArgumentParseResult<@NonNull SingleEntitySelector> parse( @@ -115,6 +146,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index 7b2655f7..d1348635 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -47,6 +47,11 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for selecting a single {@link Player} using a {@link Selector}. + * + * @param sender type + */ public final class SinglePlayerSelectorArgument extends CommandArgument { private SinglePlayerSelectorArgument( @@ -67,21 +72,47 @@ private SinglePlayerSelectorArgument( ); } - public static @NonNull SinglePlayerSelectorArgument optional(final @NonNull String name) { - return SinglePlayerSelectorArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link SinglePlayerSelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link SinglePlayerSelectorArgument} + */ public static @NonNull SinglePlayerSelectorArgument of(final @NonNull String name) { return SinglePlayerSelectorArgument.builder(name).build(); } + /** + * Create a new optional {@link SinglePlayerSelectorArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link SinglePlayerSelectorArgument} + */ + public static @NonNull SinglePlayerSelectorArgument optional(final @NonNull String name) { + return SinglePlayerSelectorArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link SinglePlayerSelector}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { - final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.player()); + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.player()); @Override public @NonNull ArgumentParseResult<@NonNull SinglePlayerSelector> parse( @@ -115,6 +146,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index e73c6e05..3d942f9d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -44,8 +44,10 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.user.UserManager; import java.util.ArrayList; import java.util.List; @@ -56,6 +58,12 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +/** + * Argument for parsing {@link User Users} in the {@link UserManager} from + * a {@link Selector}, last known username, or {@link UUID}. + * + * @param sender type + */ public final class UserArgument extends CommandArgument { private UserArgument( @@ -76,21 +84,49 @@ private UserArgument( ); } - public static @NonNull UserArgument optional(final @NonNull String name) { - return UserArgument.builder(name).asOptional().build(); - } - + /** + * Create a new required {@link UserArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link UserArgument} + */ public static @NonNull UserArgument of(final @NonNull String name) { return UserArgument.builder(name).build(); } + /** + * Create a new optional {@link UserArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link UserArgument} + */ + public static @NonNull UserArgument optional(final @NonNull String name) { + return UserArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link User Users} in the {@link UserManager} by + * {@link Selector}, last known username, or {@link UUID}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { - final ArgumentParser singlePlayerSelectorParser = new WrappedBrigadierParser<>(EntityArgument.player()); + private final ArgumentParser singlePlayerSelectorParser = + new WrappedBrigadierParser<>(EntityArgument.player()); @Override public @NonNull ArgumentParseResult<@NonNull User> parse( @@ -180,6 +216,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java index ba3d21a2..a991fb77 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -24,6 +24,7 @@ package cloud.commandframework.sponge.argument; import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; @@ -44,6 +45,18 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link Vector2d} from relative, absolute, or local coordinates. + * + *

Example input strings:

+ *
    + *
  • {@code ~ ~}
  • + *
  • {@code 0.1 -0.5}
  • + *
  • {@code ~1 ~-2}
  • + *
+ * + * @param sender type + */ public final class Vector2dArgument extends VectorArgument { private Vector2dArgument( @@ -77,6 +90,47 @@ private Vector2dArgument( return Vector2dArgument.builder(name).asOptional().build(); } + /** + * Create a new optional {@link Vector2dArgument}. + * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument optional(final @NonNull String name, final boolean centerIntegers) { + return Vector2dArgument.builder(name).centerIntegers(centerIntegers).asOptional().build(); + } + + /** + * Create a new optional {@link Vector2dArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument optional(final @NonNull String name, final @NonNull Vector2d defaultValue) { + return Vector2dArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link Vector2dArgument} with the specified default value. + * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param defaultValue default value + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument optional( + final @NonNull String name, + final boolean centerIntegers, + final @NonNull Vector2d defaultValue + ) { + return Vector2dArgument.builder(name).centerIntegers(centerIntegers).asOptionalWithDefault(defaultValue).build(); + } + /** * Create a new required {@link Vector2dArgument}. * @@ -88,6 +142,18 @@ private Vector2dArgument( return Vector2dArgument.builder(name).build(); } + /** + * Create a new required {@link Vector2dArgument}. + * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param sender type + * @return a new {@link Vector2dArgument} + */ + public static @NonNull Vector2dArgument of(final @NonNull String name, final boolean centerIntegers) { + return Vector2dArgument.builder(name).centerIntegers(centerIntegers).build(); + } + /** * Create a new {@link Builder}. * @@ -99,10 +165,20 @@ private Vector2dArgument( return new Builder<>(name); } + /** + * Parser for {@link Vector2d}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser; + /** + * Create a new {@link Parser}. + * + * @param centerIntegers whether to center integers to x.5 + */ public Parser(final boolean centerIntegers) { this.mappedParser = new WrappedBrigadierParser(new Vec2Argument(centerIntegers)) .map((ctx, coordinates) -> { @@ -128,6 +204,11 @@ public Parser(final boolean centerIntegers) { } + /** + * Builder for {@link Vector2dArgument}. + * + * @param sender type + */ public static final class Builder extends VectorArgumentBuilder> { Builder(final @NonNull String name) { @@ -146,6 +227,17 @@ public static final class Builder extends VectorArgumentBuilder asOptionalWithDefault(final @NonNull Vector2d defaultValue) { + return this.asOptionalWithDefault(String.format("%.10f %.10f", defaultValue.getX(), defaultValue.getY())); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index f8762acd..372a5855 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -45,6 +45,20 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link Vector2i} from relative, absolute, or local coordinates. + * + *

Example input strings:

+ *
    + *
  • {@code ~ ~}
  • + *
  • {@code 12 -7}
  • + *
  • {@code ^-1 ^0}
  • + *
  • {@code ~-1 ~5}
  • + *
  • {@code ^ ^}
  • + *
+ * + * @param sender type + */ public final class Vector2iArgument extends CommandArgument { private Vector2iArgument( @@ -65,6 +79,17 @@ private Vector2iArgument( ); } + /** + * Create a new required {@link Vector2iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector2iArgument} + */ + public static @NonNull Vector2iArgument of(final @NonNull String name) { + return Vector2iArgument.builder(name).build(); + } + /** * Create a new optional {@link Vector2iArgument}. * @@ -77,14 +102,15 @@ private Vector2iArgument( } /** - * Create a new required {@link Vector2iArgument}. + * Create a new optional {@link Vector2iArgument} with the specified default value. * - * @param name argument name - * @param sender type + * @param name argument name + * @param defaultValue default value + * @param sender type * @return a new {@link Vector2iArgument} */ - public static @NonNull Vector2iArgument of(final @NonNull String name) { - return Vector2iArgument.builder(name).build(); + public static @NonNull Vector2iArgument optional(final @NonNull String name, final @NonNull Vector2i defaultValue) { + return Vector2iArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** @@ -98,6 +124,11 @@ private Vector2iArgument( return new Builder<>(name); } + /** + * Parser for {@link Vector2i}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -124,6 +155,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -141,6 +177,19 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull Vector2i defaultValue) { + return this.asOptionalWithDefault( + String.format("%s %s", defaultValue.getX(), defaultValue.getY()) + ); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index 68fc69c5..7ea2c16f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -24,6 +24,7 @@ package cloud.commandframework.sponge.argument; import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; @@ -44,6 +45,19 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link Vector3d} from relative, absolute, or local coordinates. + * + *

Example input strings:

+ *
    + *
  • {@code ~ ~ ~}
  • + *
  • {@code 0.1 -0.5 .9}
  • + *
  • {@code ~1 ~-2 ~10}
  • + *
  • {@code ^1 ^ ^-5}
  • + *
+ * + * @param sender type + */ public final class Vector3dArgument extends VectorArgument { private Vector3dArgument( @@ -67,25 +81,37 @@ private Vector3dArgument( } /** - * Create a new optional {@link Vector3dArgument}. + * Create a new required {@link Vector3dArgument}. * * @param name argument name * @param sender type * @return a new {@link Vector3dArgument} */ - public static @NonNull Vector3dArgument optional(final @NonNull String name) { - return Vector3dArgument.builder(name).asOptional().build(); + public static @NonNull Vector3dArgument of(final @NonNull String name) { + return Vector3dArgument.builder(name).build(); } /** * Create a new required {@link Vector3dArgument}. * + * @param name argument name + * @param centerIntegers whether to center integers to x.5 + * @param sender type + * @return a new {@link Vector3dArgument} + */ + public static @NonNull Vector3dArgument of(final @NonNull String name, final boolean centerIntegers) { + return Vector3dArgument.builder(name).centerIntegers(centerIntegers).build(); + } + + /** + * Create a new optional {@link Vector3dArgument}. + * * @param name argument name * @param sender type * @return a new {@link Vector3dArgument} */ - public static @NonNull Vector3dArgument of(final @NonNull String name) { - return Vector3dArgument.builder(name).build(); + public static @NonNull Vector3dArgument optional(final @NonNull String name) { + return Vector3dArgument.builder(name).asOptional().build(); } /** @@ -101,15 +127,32 @@ private Vector3dArgument( } /** - * Create a new required {@link Vector3dArgument}. + * Create a new optional {@link Vector3dArgument}. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link Vector3dArgument} + */ + public static @NonNull Vector3dArgument optional(final @NonNull String name, final @NonNull Vector3d defaultValue) { + return Vector3dArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + } + + /** + * Create a new optional {@link Vector3dArgument}. * * @param name argument name * @param centerIntegers whether to center integers to x.5 + * @param defaultValue default value * @param sender type * @return a new {@link Vector3dArgument} */ - public static @NonNull Vector3dArgument of(final @NonNull String name, final boolean centerIntegers) { - return Vector3dArgument.builder(name).centerIntegers(centerIntegers).build(); + public static @NonNull Vector3dArgument optional( + final @NonNull String name, + final boolean centerIntegers, + final @NonNull Vector3d defaultValue + ) { + return Vector3dArgument.builder(name).asOptionalWithDefault(defaultValue).centerIntegers(centerIntegers).build(); } /** @@ -123,10 +166,20 @@ private Vector3dArgument( return new Builder<>(name); } + /** + * Parser for {@link Vector3d}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser; + /** + * Create a new {@link Parser}. + * + * @param centerIntegers whether to center integers to x.5 + */ public Parser(final boolean centerIntegers) { this.mappedParser = new WrappedBrigadierParser(new Vec3Argument(centerIntegers)) .map((ctx, coordinates) -> { @@ -151,6 +204,11 @@ public Parser(final boolean centerIntegers) { } + /** + * Builder for {@link Vector3dArgument}. + * + * @param sender type + */ public static final class Builder extends VectorArgumentBuilder> { Builder(final @NonNull String name) { @@ -169,6 +227,19 @@ public static final class Builder extends VectorArgumentBuilder asOptionalWithDefault(final @NonNull Vector3d defaultValue) { + return this.asOptionalWithDefault( + String.format("%.10f %.10f %.10f", defaultValue.getX(), defaultValue.getY(), defaultValue.getZ()) + ); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index eaa29297..e3b6d481 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -45,6 +45,19 @@ import java.util.Queue; import java.util.function.BiFunction; +/** + * Argument for parsing {@link Vector3i} from relative, absolute, or local coordinates. + * + *

Example input strings:

+ *
    + *
  • {@code ~ ~ ~}
  • + *
  • {@code 1 1 1}
  • + *
  • {@code ~0.5 ~-2 ~10}
  • + *
  • {@code ^1 ^ ^-5}
  • + *
+ * + * @param sender type + */ public final class Vector3iArgument extends CommandArgument { private Vector3iArgument( @@ -65,6 +78,17 @@ private Vector3iArgument( ); } + /** + * Create a new required {@link Vector3iArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link Vector3iArgument} + */ + public static @NonNull Vector3iArgument of(final @NonNull String name) { + return Vector3iArgument.builder(name).build(); + } + /** * Create a new optional {@link Vector3iArgument}. * @@ -77,14 +101,15 @@ private Vector3iArgument( } /** - * Create a new required {@link Vector3iArgument}. + * Create a new optional {@link Vector3iArgument} with the specified default value. * - * @param name argument name - * @param sender type + * @param name argument name + * @param defaultValue default value + * @param sender type * @return a new {@link Vector3iArgument} */ - public static @NonNull Vector3iArgument of(final @NonNull String name) { - return Vector3iArgument.builder(name).build(); + public static @NonNull Vector3iArgument optional(final @NonNull String name, final @NonNull Vector3i defaultValue) { + return Vector3iArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** @@ -98,6 +123,11 @@ private Vector3iArgument( return new Builder<>(name); } + /** + * Parser for {@link Vector3i}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser mappedParser = @@ -123,6 +153,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -140,6 +175,19 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull Vector3i defaultValue) { + return this.asOptionalWithDefault( + String.format("%s %s %s", defaultValue.getX(), defaultValue.getY(), defaultValue.getZ()) + ); + } + } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java index 5af178ff..a929c65b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java @@ -69,7 +69,7 @@ public boolean centerIntegers() { } /** - * Parent class for Vector argument type builders. + * Parent of {@link Vector3dArgument.Builder} and {@link Vector2dArgument.Builder}. * *

Not for extension by API users.

* diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 75ab4576..47345b3a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -37,6 +37,7 @@ import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.api.world.server.WorldManager; import java.lang.reflect.Field; import java.util.List; @@ -46,6 +47,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +/** + * Argument for retrieving {@link ServerWorld ServerWorlds} from the {@link WorldManager} by their {@link ResourceKey}. + * + * @param sender type + */ public final class WorldArgument extends CommandArgument { private WorldArgument( @@ -66,18 +72,56 @@ private WorldArgument( ); } + /** + * Create a new required {@link WorldArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link WorldArgument} + */ + public static @NonNull WorldArgument of(final @NonNull String name) { + return WorldArgument.builder(name).build(); + } + + /** + * Create a new optional {@link WorldArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link WorldArgument} + */ public static @NonNull WorldArgument optional(final @NonNull String name) { return WorldArgument.builder(name).asOptional().build(); } - public static @NonNull WorldArgument of(final @NonNull String name) { - return WorldArgument.builder(name).build(); + /** + * Create a new optional {@link WorldArgument} with the specified default value. + * + * @param name argument name + * @param defaultValue default value + * @param sender type + * @return a new {@link WorldArgument} + */ + public static @NonNull WorldArgument optional(final @NonNull String name, final @NonNull ResourceKey defaultValue) { + return WorldArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ public static @NonNull Builder builder(final @NonNull String name) { return new Builder<>(name); } + /** + * Parser for {@link ServerWorld ServerWorlds} in the {@link WorldManager}. + * + * @param sender type + */ public static final class Parser implements NodeSupplyingArgumentParser { private static final DynamicCommandExceptionType ERROR_INVALID_VALUE; @@ -132,6 +176,11 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type + */ public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { @@ -150,7 +199,7 @@ public static final class Builder extends TypedBuilder { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java index 7e65bef3..29642f48 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java @@ -26,7 +26,8 @@ import org.spongepowered.api.entity.living.player.Player; /** - * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may only select {@link Player Players}. + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may + * select one or more {@link Player Players}. */ public interface MultiplePlayerSelector extends SelectorWrapper { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java index 4fd85a2e..124d8d4c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java @@ -26,8 +26,8 @@ import org.spongepowered.api.entity.Entity; /** - * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select {@code 1} or {@code 0} - * {@link Entity Entities}. + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which + * may select a single {@link Entity}. */ public interface SingleEntitySelector extends SelectorWrapper.Single { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java index 32a7e3e6..41e80065 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java @@ -26,8 +26,7 @@ import org.spongepowered.api.entity.living.player.Player; /** - * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select {@code 1} or {@code 0} - * {@link Player Players}. + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select a single {@link Player}. */ public interface SinglePlayerSelector extends SelectorWrapper.Single { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java index 062bad6f..2f04885c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java @@ -22,6 +22,6 @@ // SOFTWARE. // /** - * Data holders for sponge. + * Data holders for cloud-sponge. */ package cloud.commandframework.sponge.data; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index e6aa07af..c4f093a0 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -83,6 +83,7 @@ import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.service.permission.Subject; import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.math.vector.Vector3d; @@ -375,6 +376,15 @@ private void registerCommands() { ctx.getSender().audience().sendMessage(text("no location!")); } })); + this.commandManager.command(cloud.literal("blockstate") + .argument(BlockStateArgument.of("blockstate")) + .handler(ctx -> { + final BlockState blockState = ctx.get("blockstate"); + ctx.getSender().audience().sendMessage(text( + PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() + .apply(RegistryTypes.BLOCK_TYPE.get(), blockState) + )); + })); } } From 124173bb467f4a782eb094be6bb7fb946b3cc06d Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 27 Apr 2021 02:46:45 -0700 Subject: [PATCH 18/72] sponge: Fix injection module types --- .../sponge/CloudInjectionModule.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index cb98e691..ab46a8e2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -30,7 +30,6 @@ import com.google.inject.util.Types; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.CommandCause; -import org.spongepowered.api.service.permission.Subject; import java.lang.reflect.Type; import java.util.function.Function; @@ -91,21 +90,22 @@ public CloudInjectionModule( protected void configure() { final Type commandTreeType = Types.newParameterizedType(CommandTree.class, this.commandSenderType); final Type commandExecutionCoordinatorType = Types.newParameterizedType( - CommandExecutionCoordinator.class, - this.commandSenderType + CommandExecutionCoordinator.class, this.commandSenderType ); - final Type executorFunction = Types.newParameterizedType(Function.class, commandTreeType, - commandExecutionCoordinatorType + final Type executorFunction = Types.newParameterizedType( + Function.class, commandTreeType, commandExecutionCoordinatorType ); final Key executorFunctionKey = Key.get(executorFunction); this.bind(executorFunctionKey).toInstance(this.commandExecutionCoordinator); - final Type commandSenderMapperFunction = Types.newParameterizedType(Function.class, - this.commandSenderType, Subject.class + + final Type commandSenderMapperFunction = Types.newParameterizedType( + Function.class, this.commandSenderType, CommandCause.class ); final Key commandSenderMapperFunctionKey = Key.get(commandSenderMapperFunction); this.bind(commandSenderMapperFunctionKey).toInstance(this.causeMapper); - final Type backwardsCommandSenderMapperFunction = Types.newParameterizedType(Function.class, CommandCause.class, - this.commandSenderType + + final Type backwardsCommandSenderMapperFunction = Types.newParameterizedType( + Function.class, CommandCause.class, this.commandSenderType ); final Key backwardsCommandSenderMapperFunctionKey = Key.get(backwardsCommandSenderMapperFunction); this.bind(backwardsCommandSenderMapperFunctionKey).toInstance(this.backwardsCauseMapper); From ced14f9b91f8bfbde108601b6e317add648e1835 Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 27 Apr 2021 15:48:48 -0700 Subject: [PATCH 19/72] Add macOS garbage to .gitignore --- .DS_Store | Bin 6148 -> 0 bytes cloud-minecraft/.DS_Store | Bin 6148 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 cloud-minecraft/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7ca8f1a41c7a5cc539659b7dc839ad67546b933e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}OId5Uw^+I}u3^f;slZTZ9DHzk@Ku?7^EbvU^xXXEIqcFiuNmV$f`sd5!gr z_6hcNtm>{T>t+`Zf=K9s>aV)Hs)zcZyQTm@bVgAdpbh{Mm9SjJ;U7Z#q;s;wD`iAs z&WK^s zwU17&Ztfo@-=^PxSe^wwOGavpGk8Sfg|zSdVVdal8a?Th5@bk7Z&AtM^!`eEMwi1y zWPmS+TwBECTuzPw$H1!?p!Y$c5_*hOeRKh|Dn{R~1Nr$B1JcPo`5y28%LI5GO zhN9W=9~q!;Hw_n%fQAly{(doBgx&USnCK8=Uc=iYZfCXHn<$JG$0sJGEX(pt`P9GG zT|W!5PP-Abj;XgFWY?jy5427`>>xaho87a@+_p}$AWoYtlN?7)3^_T9(@1w4x|2q2 zGmmcvq%6tOS!JQu+gz?!)#^sQUsb*J^;%V}EU)$ZB{{!X-`YFBxqs+A_Me_D%L0E$ zBeM<%@PfvV8@}^fX`<6Bj2Yw)@)(%`W`G$OAqLzLC#ObePrMaofEoB52IzcHsDz%w z+@d);u%YWCjTZ??(5ANpp>pUs%q`*wim<7OHdVMMhOp`AS1!(Tm|L{zAk4}*k6T%| z7m6^eqhFbD5S~SDnE__tD+6P;TcP^D`}6z%YZCXE0cK#N7!buBf2V<4aNzS2#pM=1QqVA^7-OjvFQ6Jhzaj(CbC_F14+>ud3=P~c1AofEI|89p$N&HU From 28bde90660203baa997c23a63d5843fd2649c67e Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 27 Apr 2021 16:00:05 -0700 Subject: [PATCH 20/72] sponge: Fix license header violations --- .../java/cloud/commandframework/sponge/SpongeCaptionKeys.java | 1 - .../cloud/commandframework/sponge/SpongeCaptionRegistry.java | 1 - .../cloud/commandframework/sponge/annotations/package-info.java | 1 - .../sponge/annotations/specifier/package-info.java | 1 - 4 files changed, 4 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index a5242972..af48c5b7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -21,7 +21,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - package cloud.commandframework.sponge; import cloud.commandframework.captions.Caption; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index 8b880fc0..679ced80 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -21,7 +21,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - package cloud.commandframework.sponge; import cloud.commandframework.captions.SimpleCaptionRegistry; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java index 58830dec..1dece579 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java @@ -21,7 +21,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - /** * Annotations for cloud-sponge. */ diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java index 8b1ce7e6..d4d6e2b2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java @@ -21,7 +21,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - /** * Specifier annotations for cloud-sponge. */ From 5085ab999b8c59e1c9657cf53d2c84e7ce846a03 Mon Sep 17 00:00:00 2001 From: jmp Date: Wed, 28 Apr 2021 15:23:36 -0700 Subject: [PATCH 21/72] sponge: Clean up number argument mapping, unwrap mapped parsers --- .../sponge/SpongeCommandManager.java | 2 +- .../sponge/SpongeParserMapper.java | 38 ++++++++++++------- .../package-info.java | 2 +- .../specifier/Center.java | 2 +- .../specifier/package-info.java | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/{annotations => annotation}/package-info.java (95%) rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/{annotations => annotation}/specifier/Center.java (96%) rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/{annotations => annotation}/specifier/package-info.java (95%) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 16dd70e4..f8768c4d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -29,7 +29,7 @@ import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; -import cloud.commandframework.sponge.annotations.specifier.Center; +import cloud.commandframework.sponge.annotation.specifier.Center; import cloud.commandframework.sponge.argument.BlockStateArgument; import cloud.commandframework.sponge.argument.ComponentArgument; import cloud.commandframework.sponge.argument.DataContainerArgument; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 14c25aa6..76572d61 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -26,11 +26,13 @@ import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.compound.FlagArgument; import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.MappedArgumentParser; import cloud.commandframework.arguments.standard.BooleanArgument; import cloud.commandframework.arguments.standard.ByteArgument; import cloud.commandframework.arguments.standard.DoubleArgument; import cloud.commandframework.arguments.standard.FloatArgument; import cloud.commandframework.arguments.standard.IntegerArgument; +import cloud.commandframework.arguments.standard.LongArgument; import cloud.commandframework.arguments.standard.ShortArgument; import cloud.commandframework.arguments.standard.StringArgument; import cloud.commandframework.arguments.standard.StringArrayArgument; @@ -74,8 +76,11 @@ public final class SpongeParserMapper { @SuppressWarnings({"unchecked", "rawtypes"}) CommandTreeNode.Argument> toSponge(final CommandArgument value) { + ArgumentParser parser = value.getParser(); + while (parser instanceof MappedArgumentParser) { + parser = ((MappedArgumentParser) parser).getBaseParser(); + } final CommandTreeNode.Argument> result; - final ArgumentParser parser = value.getParser(); final Mapping mapper = this.mappers.get(parser.getClass()); if (mapper != null) { final CommandTreeNode.Argument> apply = @@ -127,12 +132,10 @@ private void initStandardMappers() { this.registerMapping(new TypeToken>() { }, builder -> builder.to(integerParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); - final boolean hasMin = integerParser.getMin() != Integer.MIN_VALUE; - final boolean hasMax = integerParser.getMax() != Integer.MAX_VALUE; - if (hasMin) { + if (integerParser.hasMin()) { node.min(integerParser.getMin()); } - if (hasMax) { + if (integerParser.hasMax()) { node.max(integerParser.getMax()); } return node; @@ -140,12 +143,10 @@ private void initStandardMappers() { this.registerMapping(new TypeToken>() { }, builder -> builder.to(floatParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); - final boolean hasMin = floatParser.getMin() != Float.NEGATIVE_INFINITY; - final boolean hasMax = floatParser.getMax() != Float.POSITIVE_INFINITY; - if (hasMin) { + if (floatParser.hasMin()) { node.min(floatParser.getMin()); } - if (hasMax) { + if (floatParser.hasMax()) { node.max(floatParser.getMax()); } return node; @@ -153,16 +154,25 @@ private void initStandardMappers() { this.registerMapping(new TypeToken>() { }, builder -> builder.to(doubleParser -> { final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); - final boolean hasMin = doubleParser.getMin() != Double.NEGATIVE_INFINITY; - final boolean hasMax = doubleParser.getMax() != Double.POSITIVE_INFINITY; - if (hasMin) { + if (doubleParser.hasMin()) { node.min(doubleParser.getMin()); } - if (hasMax) { + if (doubleParser.hasMax()) { node.max(doubleParser.getMax()); } return node; })); + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(longParser -> { + final CommandTreeNode.Range node = ClientCompletionKeys.LONG.get().createNode(); + if (longParser.hasMin()) { + node.min(longParser.getMin()); + } + if (longParser.hasMax()) { + node.max(longParser.getMax()); + } + return node; + })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(booleanParser -> { return ClientCompletionKeys.BOOL.get().createNode(); @@ -243,6 +253,8 @@ public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { }, cloudNumberSuggestions); this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() { + }, cloudNumberSuggestions); } /** diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java similarity index 95% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java index 1dece579..3019c7a4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java @@ -24,4 +24,4 @@ /** * Annotations for cloud-sponge. */ -package cloud.commandframework.sponge.annotations; +package cloud.commandframework.sponge.annotation; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java similarity index 96% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java index 48fbe327..7e097f67 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/Center.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.annotations.specifier; +package cloud.commandframework.sponge.annotation.specifier; import cloud.commandframework.sponge.argument.Vector2dArgument; import cloud.commandframework.sponge.argument.Vector3dArgument; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java similarity index 95% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java index d4d6e2b2..765e84c1 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotations/specifier/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java @@ -24,4 +24,4 @@ /** * Specifier annotations for cloud-sponge. */ -package cloud.commandframework.sponge.annotations.specifier; +package cloud.commandframework.sponge.annotation.specifier; From 26c39ba6a824846a946aecb8bd52f0b86548e0fc Mon Sep 17 00:00:00 2001 From: jmp Date: Fri, 30 Apr 2021 16:54:09 -0700 Subject: [PATCH 22/72] sponge: Map compound arguments --- .../sponge/CloudSpongeCommand.java | 75 +++++++++++++++---- .../sponge/SpongeCommandContextKeys.java | 2 +- .../sponge/SpongeCommandManager.java | 3 + .../sponge/SpongeCommandPreprocessor.java | 2 +- .../sponge/SpongeParserMapper.java | 19 +++-- .../sponge/argument/BlockStateArgument.java | 8 ++ .../sponge/argument/GameProfileArgument.java | 10 ++- .../GameProfileCollectionArgument.java | 10 ++- .../argument/ItemStackSnapshotArgument.java | 8 ++ .../MultipleEntitySelectorArgument.java | 10 ++- .../MultiplePlayerSelectorArgument.java | 10 ++- .../argument/NamedTextColorArgument.java | 11 ++- .../sponge/argument/OperatorArgument.java | 11 +++ .../SingleEntitySelectorArgument.java | 10 ++- .../SinglePlayerSelectorArgument.java | 11 ++- .../sponge/argument/UserArgument.java | 2 +- .../sponge/argument/Vector2dArgument.java | 10 ++- .../sponge/argument/Vector2iArgument.java | 10 ++- .../sponge/argument/Vector3dArgument.java | 10 ++- .../sponge/argument/Vector3iArgument.java | 10 ++- 20 files changed, 205 insertions(+), 37 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index fdd30ee2..0ecb839c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -26,6 +26,8 @@ import cloud.commandframework.CommandTree; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.StaticArgument; +import cloud.commandframework.arguments.compound.CompoundArgument; +import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.exceptions.ArgumentParseException; import cloud.commandframework.exceptions.CommandExecutionException; import cloud.commandframework.exceptions.InvalidCommandSenderException; @@ -34,6 +36,7 @@ import cloud.commandframework.exceptions.NoSuchCommandException; import cloud.commandframework.permission.CommandPermission; import cloud.commandframework.permission.Permission; +import cloud.commandframework.types.tuples.Pair; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; @@ -45,6 +48,7 @@ import org.spongepowered.api.command.parameter.ArgumentReader; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import java.util.ArrayDeque; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -260,20 +264,22 @@ public CommandTreeNode.Root commandTree() { return (CommandTreeNode.Root) root; } + @SuppressWarnings("unchecked") private void addChildren(final CommandTreeNode node, final CommandTree.Node> cloud) { for (final CommandTree.Node> child : cloud.getChildren()) { final CommandArgument value = child.getValue(); final CommandTreeNode.Argument> treeNode; if (value instanceof StaticArgument) { treeNode = (CommandTreeNode.Argument>) CommandTreeNode.literal(); + } else if (value instanceof CompoundArgument) { + final CompoundArgument compound = (CompoundArgument) value; + this.handleCompoundArgument(node, child, compound); + return; } else { - treeNode = this.commandManager.parserMapper().toSponge(value); + treeNode = this.commandManager.parserMapper().mapArgument(value); } this.addRequirement(child, treeNode); - if (child.isLeaf() - || !child.getValue().isRequired() - || child.getValue().getOwningCommand() != null - || child.getChildren().stream().noneMatch(c -> c.getValue().isRequired())) { + if (canExecute(child)) { treeNode.executable(); } this.addChildren(treeNode, child); @@ -281,28 +287,65 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node node, + final CommandTree.Node> child, + final CompoundArgument compound + ) { + final CommandTreeNode.Argument> treeNode; + final Object[] names = compound.getNames().toArray(); + final Object[] parsers = compound.getParserTuple().toArray(); + final ArrayDeque>>> nodes = new ArrayDeque<>(); + for (int i = 0; i < parsers.length; i++) { + final ArgumentParser parser = (ArgumentParser) parsers[i]; + final String name = (String) names[i]; + nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(parser))); + } + Pair>> argument = null; + while (!nodes.isEmpty()) { + final Pair>> prev = argument; + argument = nodes.removeLast(); + if (prev != null) { + argument.getSecond().child(prev.getFirst(), prev.getSecond()); + } else { + // last node + if (canExecute(child)) { + argument.getSecond().executable(); + } + } + this.addRequirement(child, argument.getSecond()); + } + treeNode = argument.getSecond(); + this.addChildren(treeNode, child); + node.child(names[0].toString(), treeNode); + } + + private static boolean canExecute(final CommandTree.@NonNull Node> node) { + return node.isLeaf() + || !node.getValue().isRequired() + || node.getValue().getOwningCommand() != null + || node.getChildren().stream().noneMatch(c -> c.getValue().isRequired()); + } + private void addRequirement( final CommandTree.@NonNull Node> cloud, final @NonNull CommandTreeNode> node ) { - final CommandPermission permission = (CommandPermission) cloud.getNodeMeta().getOrDefault( - "permission", - Permission.empty() - ); - if (permission != Permission.empty()) { - node.requires(cause -> this.commandManager.hasPermission( - this.commandManager.backwardsCauseMapper().apply(cause), - permission - )); + final CommandPermission permission = (CommandPermission) cloud.getNodeMeta() + .getOrDefault("permission", Permission.empty()); + if (permission == Permission.empty()) { + return; } + node.requires(cause -> + this.commandManager.hasPermission(this.commandManager.backwardsCauseMapper().apply(cause), permission)); } private String formatCommandForParsing(final @NonNull String arguments) { if (arguments.isEmpty()) { return this.label; - } else { - return this.label + " " + arguments; } + return this.label + " " + arguments; } private String formatCommandForSuggestions(final @NonNull String arguments) { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index 3ddc5316..462f6736 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -37,7 +37,7 @@ public final class SpongeCommandContextKeys { * The Sponge native {@link org.spongepowered.api.command.CommandCause} instance is stored in the {@link cloud.commandframework.context.CommandContext} * by {@link SpongeCommandPreprocessor} */ - public static final CloudKey COMMAND_CAUSE_KEY = SimpleCloudKey.of( + public static final CloudKey COMMAND_CAUSE = SimpleCloudKey.of( "cloud:sponge_command_cause", TypeToken.get(CommandCause.class) ); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index f8768c4d..d9c09f40 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -256,6 +256,9 @@ public boolean hasPermission( @NonNull final C sender, @NonNull final String permission ) { + if (permission.isEmpty()) { + return true; + } return this.causeMapper.apply(sender).hasPermission(permission); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index c9c856a1..b84e5a64 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -51,7 +51,7 @@ final class SpongeCommandPreprocessor implements CommandPreprocessor { @Override public void accept(final @NonNull CommandPreprocessingContext context) { final CommandCause commandCause = this.commandManager.causeMapper().apply(context.getCommandContext().getSender()); - context.getCommandContext().store(SpongeCommandContextKeys.COMMAND_CAUSE_KEY, commandCause); + context.getCommandContext().store(SpongeCommandContextKeys.COMMAND_CAUSE, commandCause); // For WrappedBrigadierParser. The CloudBrigadierManager will store this in context as well, however we are not using // the CloudBrigadierManager, only the WrapperBrigadierParser. CommandCause is mixed into CommandSourceStack, which is diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 76572d61..de6b9840 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -74,13 +74,22 @@ public final class SpongeParserMapper { this.initStandardMappers(); } + CommandTreeNode.Argument> mapArgument(final CommandArgument value) { + final CommandTreeNode.Argument> result = this.mapParser(value.getParser()); + final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); + if (customSuggestionsProvider) { + result.customSuggestions(); + } + return result; + } + @SuppressWarnings({"unchecked", "rawtypes"}) - CommandTreeNode.Argument> toSponge(final CommandArgument value) { - ArgumentParser parser = value.getParser(); + CommandTreeNode.Argument> mapParser(final ArgumentParser argumentParser) { + final CommandTreeNode.Argument> result; + ArgumentParser parser = argumentParser; while (parser instanceof MappedArgumentParser) { parser = ((MappedArgumentParser) parser).getBaseParser(); } - final CommandTreeNode.Argument> result; final Mapping mapper = this.mappers.get(parser.getClass()); if (mapper != null) { final CommandTreeNode.Argument> apply = @@ -95,10 +104,6 @@ CommandTreeNode.Argument> toSponge(final C } else { result = ClientCompletionKeys.STRING.get().createNode().customSuggestions().word(); } - final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); - if (customSuggestionsProvider) { - result.customSuggestions(); - } return result; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java index 209e756e..3b6e8dc5 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java @@ -175,6 +175,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.BLOCK_STATE.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index 11e81781..5af24358 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -120,7 +120,7 @@ public static final class Parser implements NodeSupplyingArgumentParser profiles; try { profiles = argumentResult.getNames( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) ); } catch (final CommandSyntaxException ex) { return ArgumentParseResult.failure(ex); @@ -140,6 +140,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.GAME_PROFILE.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index 59472310..3dfc0bd6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -123,7 +123,7 @@ public static final class Parser implements NodeSupplyingArgumentParser profiles; try { profiles = argumentResult.getNames( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) ); } catch (final CommandSyntaxException ex) { return ArgumentParseResult.failure(ex); @@ -146,6 +146,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.GAME_PROFILE.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java index a739d049..3eaaf2b0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java @@ -201,6 +201,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.ITEM_STACK.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 89c80dcb..48afb58b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -131,7 +131,7 @@ public static final class Parser implements NodeSupplyingArgumentParser entities; try { entities = parsed.findEntities( - (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) ).stream().map(e -> (Entity) e).collect(Collectors.toList()); } catch (final CommandSyntaxException ex) { return ArgumentParseResult.failure(ex); @@ -141,6 +141,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.nativeParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.ENTITY.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index 571fd25f..64783a42 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -131,7 +131,7 @@ public static final class Parser implements NodeSupplyingArgumentParser players; try { players = parsed.findPlayers( - (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) ).stream().map(p -> (Player) p).collect(Collectors.toList()); } catch (final CommandSyntaxException ex) { return ArgumentParseResult.failure(ex); @@ -141,6 +141,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.nativeParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.ENTITY.get().createNode().playersOnly(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index 66afeb41..0ea6921d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -36,6 +36,7 @@ import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -109,7 +110,7 @@ private NamedTextColorArgument( * Create a new {@link Builder}. * * @param name argument name - * @param sender type + * @param sender type * @return a new {@link Builder} */ public static @NonNull Builder builder(final @NonNull String name) { @@ -140,6 +141,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return new ArrayList<>(NamedTextColor.NAMES.keys()); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.COLOR.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index ea8f34b7..1f05e56b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -43,6 +43,7 @@ import java.util.Optional; import java.util.Queue; import java.util.function.BiFunction; +import java.util.stream.Collectors; /** * An argument for parsing {@link Operator Operators}. @@ -166,6 +167,16 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return RegistryTypes.OPERATOR.get().stream() + .map(Operator::asString) + .collect(Collectors.toList()); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.OPERATION.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index 8cebf7bc..fafd8327 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -129,7 +129,7 @@ public static final class Parser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.nativeParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.ENTITY.get().createNode().single(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index d1348635..ff7f67e7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -128,8 +128,9 @@ public static final class Parser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.nativeParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.ENTITY.get().createNode().playersOnly().single(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index 3d942f9d..b281c62c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -185,7 +185,7 @@ public static final class Parser implements NodeSupplyingArgumentParser(new Vec2Argument(centerIntegers)) .map((ctx, coordinates) -> { final Vec3 position = coordinates.getPosition( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) ); return ArgumentParseResult.success(new Vector2d(position.x, position.z)); }); @@ -197,6 +197,14 @@ public Parser(final boolean centerIntegers) { return this.mappedParser.parse(commandContext, inputQueue); } + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.VEC2.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index 372a5855..a2e9d479 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -135,7 +135,7 @@ public static final class Parser implements NodeSupplyingArgumentParser(ColumnPosArgument.columnPos()) .map((ctx, coordinates) -> { final BlockPos pos = coordinates.getBlockPos( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY) + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) ); return ArgumentParseResult.success(new Vector2i(pos.getX(), pos.getZ())); }); @@ -148,6 +148,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.COLUMN_POS.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index 7ea2c16f..53a12cf2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -184,7 +184,7 @@ public Parser(final boolean centerIntegers) { this.mappedParser = new WrappedBrigadierParser(new Vec3Argument(centerIntegers)) .map((ctx, coordinates) -> { return ArgumentParseResult.success(VecHelper.toVector3d( - coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) + coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) )); }); } @@ -197,6 +197,14 @@ public Parser(final boolean centerIntegers) { return this.mappedParser.parse(commandContext, inputQueue); } + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.VEC3.get().createNode(); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index e3b6d481..5e4abbb7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -134,7 +134,7 @@ public static final class Parser implements NodeSupplyingArgumentParser(BlockPosArgument.blockPos()) .map((ctx, coordinates) -> { return ArgumentParseResult.success(VecHelper.toVector3i( - coordinates.getBlockPos((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE_KEY)) + coordinates.getBlockPos((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) )); }); @@ -146,6 +146,14 @@ public static final class Parser implements NodeSupplyingArgumentParser suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + @Override public CommandTreeNode.@NonNull Argument> node() { return ClientCompletionKeys.BLOCK_POS.get().createNode(); From b206f8bf7e225d0c1dc4cb1fb75fcbde1d9ba60a Mon Sep 17 00:00:00 2001 From: jmp Date: Fri, 30 Apr 2021 16:57:46 -0700 Subject: [PATCH 23/72] sponge: Update for sponge math changes --- .../commandframework/sponge/argument/Vector2dArgument.java | 2 +- .../commandframework/sponge/argument/Vector2iArgument.java | 2 +- .../commandframework/sponge/argument/Vector3dArgument.java | 2 +- .../commandframework/sponge/argument/Vector3iArgument.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java index d2eac10a..4c7b580f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -243,7 +243,7 @@ public static final class Builder extends VectorArgumentBuilder asOptionalWithDefault(final @NonNull Vector2d defaultValue) { - return this.asOptionalWithDefault(String.format("%.10f %.10f", defaultValue.getX(), defaultValue.getY())); + return this.asOptionalWithDefault(String.format("%.10f %.10f", defaultValue.x(), defaultValue.y())); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index a2e9d479..6fc387be 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -194,7 +194,7 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull Vector2i defaultValue) { return this.asOptionalWithDefault( - String.format("%s %s", defaultValue.getX(), defaultValue.getY()) + String.format("%s %s", defaultValue.x(), defaultValue.y()) ); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index 53a12cf2..06ab6498 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -244,7 +244,7 @@ public static final class Builder extends VectorArgumentBuilder asOptionalWithDefault(final @NonNull Vector3d defaultValue) { return this.asOptionalWithDefault( - String.format("%.10f %.10f %.10f", defaultValue.getX(), defaultValue.getY(), defaultValue.getZ()) + String.format("%.10f %.10f %.10f", defaultValue.x(), defaultValue.y(), defaultValue.z()) ); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index 5e4abbb7..36367773 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -192,7 +192,7 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull Vector3i defaultValue) { return this.asOptionalWithDefault( - String.format("%s %s %s", defaultValue.getX(), defaultValue.getY(), defaultValue.getZ()) + String.format("%s %s %s", defaultValue.x(), defaultValue.y(), defaultValue.z()) ); } From c45f0a36657059f9f0bc35d776b2f6a766205c5f Mon Sep 17 00:00:00 2001 From: jmp Date: Sat, 1 May 2021 20:49:50 -0700 Subject: [PATCH 24/72] sponge: Implement Block and ItemStack predicate arguments --- .../sponge/CloudSpongeCommand.java | 2 +- .../sponge/SpongeCommandContextKeys.java | 2 +- .../sponge/SpongeCommandManager.java | 26 ++- ...eArgument.java => BlockInputArgument.java} | 156 ++++++++++--- .../argument/BlockPredicateArgument.java | 216 ++++++++++++++++++ .../argument/ItemStackPredicateArgument.java | 212 +++++++++++++++++ ...ument.java => ProtoItemStackArgument.java} | 153 +++++++++---- .../sponge/argument/package-info.java | 2 +- .../sponge/data/BlockInput.java | 77 +++++++ .../sponge/data/BlockPredicate.java | 52 +++++ .../sponge/data/ItemStackPredicate.java | 35 +++ .../sponge/data/ProtoItemStack.java | 84 +++++++ .../ComponentMessageRuntimeException.java | 97 ++++++++ .../sponge/exception/package-info.java | 27 +++ .../commandframework/sponge/package-info.java | 2 +- .../examples/sponge/CloudExamplePlugin.java | 104 +++++++-- 16 files changed, 1129 insertions(+), 118 deletions(-) rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/{BlockStateArgument.java => BlockInputArgument.java} (56%) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java rename cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/{ItemStackSnapshotArgument.java => ProtoItemStackArgument.java} (60%) create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java create mode 100644 cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 0ecb839c..de6b41c4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -274,7 +274,7 @@ private void addChildren(final CommandTreeNode node, final CommandTree.Node compound = (CompoundArgument) value; this.handleCompoundArgument(node, child, compound); - return; + continue; } else { treeNode = this.commandManager.parserMapper().mapArgument(value); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index 462f6736..3f44de0b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -29,7 +29,7 @@ import org.spongepowered.api.command.CommandCause; /** - * Sponge related {@link cloud.commandframework.context.CommandContext} keys + * Sponge related {@link cloud.commandframework.context.CommandContext} keys. */ public final class SpongeCommandContextKeys { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index d9c09f40..d225fdad 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -30,16 +30,18 @@ import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.sponge.annotation.specifier.Center; -import cloud.commandframework.sponge.argument.BlockStateArgument; +import cloud.commandframework.sponge.argument.BlockInputArgument; +import cloud.commandframework.sponge.argument.BlockPredicateArgument; import cloud.commandframework.sponge.argument.ComponentArgument; import cloud.commandframework.sponge.argument.DataContainerArgument; import cloud.commandframework.sponge.argument.GameProfileArgument; import cloud.commandframework.sponge.argument.GameProfileCollectionArgument; -import cloud.commandframework.sponge.argument.ItemStackSnapshotArgument; +import cloud.commandframework.sponge.argument.ItemStackPredicateArgument; import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; import cloud.commandframework.sponge.argument.MultiplePlayerSelectorArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; +import cloud.commandframework.sponge.argument.ProtoItemStackArgument; import cloud.commandframework.sponge.argument.RegistryEntryArgument; import cloud.commandframework.sponge.argument.ResourceKeyArgument; import cloud.commandframework.sponge.argument.SingleEntitySelectorArgument; @@ -50,9 +52,12 @@ import cloud.commandframework.sponge.argument.Vector3dArgument; import cloud.commandframework.sponge.argument.Vector3iArgument; import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.BlockPredicate; import cloud.commandframework.sponge.data.GameProfileCollection; +import cloud.commandframework.sponge.data.ItemStackPredicate; import cloud.commandframework.sponge.data.MultipleEntitySelector; import cloud.commandframework.sponge.data.MultiplePlayerSelector; +import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.data.SingleEntitySelector; import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.google.common.collect.ImmutableSet; @@ -68,7 +73,6 @@ import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; -import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.registry.DefaultedRegistryType; import org.spongepowered.api.registry.Registry; @@ -151,8 +155,12 @@ private void registerParsers() { params -> new WorldArgument.Parser<>() ); this.getParserRegistry().registerParserSupplier( - TypeToken.get(ItemStackSnapshot.class), - params -> new ItemStackSnapshotArgument.Parser<>() + TypeToken.get(ProtoItemStack.class), + params -> new ProtoItemStackArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(ItemStackPredicate.class), + params -> new ItemStackPredicateArgument.Parser<>() ); this.getParserRegistry().registerParserSupplier( TypeToken.get(ResourceKey.class), @@ -167,8 +175,12 @@ private void registerParsers() { params -> new GameProfileCollectionArgument.Parser<>() ); this.getParserRegistry().registerParserSupplier( - TypeToken.get(BlockStateArgument.class), - params -> new BlockStateArgument.Parser<>() + TypeToken.get(BlockInputArgument.class), + params -> new BlockInputArgument.Parser<>() + ); + this.getParserRegistry().registerParserSupplier( + TypeToken.get(BlockPredicate.class), + params -> new BlockPredicateArgument.Parser<>() ); this.getParserRegistry().registerParserSupplier( TypeToken.get(User.class), diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java similarity index 56% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java index 3b6e8dc5..1f21a2fa 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockStateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java @@ -30,24 +30,35 @@ import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import net.minecraft.commands.arguments.blocks.BlockInput; +import cloud.commandframework.sponge.data.BlockInput; +import net.minecraft.commands.arguments.blocks.BlockStateArgument; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.BlockType; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.BlockChangeFlag; +import org.spongepowered.api.world.BlockChangeFlags; import org.spongepowered.api.world.schematic.PaletteTypes; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.common.data.persistence.NBTTranslator; +import org.spongepowered.common.util.VecHelper; +import org.spongepowered.common.world.SpongeBlockChangeFlag; +import java.lang.reflect.Field; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; /** - * An argument for parsing {@link BlockState BlockStates} from a {@link BlockType} identifier - * and optional extra properties. + * An argument for parsing {@link BlockInput} from a {@link BlockState} + * and optional extra NBT data. * *

Example input strings:

*
    @@ -58,9 +69,9 @@ * * @param sender type */ -public final class BlockStateArgument extends CommandArgument { +public final class BlockInputArgument extends CommandArgument { - private BlockStateArgument( + private BlockInputArgument( final boolean required, final @NonNull String name, final @NonNull String defaultValue, @@ -72,77 +83,77 @@ private BlockStateArgument( name, new Parser<>(), defaultValue, - BlockState.class, + BlockInput.class, suggestionsProvider, defaultDescription ); } /** - * Create a new required {@link BlockStateArgument}. + * Create a new required {@link BlockInputArgument}. * * @param name argument name * @param sender type - * @return a new {@link BlockStateArgument} + * @return a new {@link BlockInputArgument} */ - public static @NonNull BlockStateArgument of(final @NonNull String name) { - return BlockStateArgument.builder(name).build(); + public static @NonNull BlockInputArgument of(final @NonNull String name) { + return BlockInputArgument.builder(name).build(); } /** - * Create a new optional {@link BlockStateArgument}. + * Create a new optional {@link BlockInputArgument}. * * @param name argument name * @param sender type - * @return a new {@link BlockStateArgument} + * @return a new {@link BlockInputArgument} */ - public static @NonNull BlockStateArgument optional(final @NonNull String name) { - return BlockStateArgument.builder(name).asOptional().build(); + public static @NonNull BlockInputArgument optional(final @NonNull String name) { + return BlockInputArgument.builder(name).asOptional().build(); } /** - * Create a new optional {@link BlockStateArgument} with the specified default value. + * Create a new optional {@link BlockInputArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link BlockStateArgument} + * @return a new {@link BlockInputArgument} */ - public static @NonNull BlockStateArgument optional( + public static @NonNull BlockInputArgument optional( final @NonNull String name, final @NonNull BlockState defaultValue ) { - return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** - * Create a new optional {@link BlockStateArgument} with the specified default value. + * Create a new optional {@link BlockInputArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link BlockStateArgument} + * @return a new {@link BlockInputArgument} */ - public static @NonNull BlockStateArgument optional( + public static @NonNull BlockInputArgument optional( final @NonNull String name, final @NonNull BlockType defaultValue ) { - return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** - * Create a new optional {@link BlockStateArgument} with the specified default value. + * Create a new optional {@link BlockInputArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link BlockStateArgument} + * @return a new {@link BlockInputArgument} */ - public static @NonNull BlockStateArgument optional( + public static @NonNull BlockInputArgument optional( final @NonNull String name, final @NonNull DefaultedRegistryReference defaultValue ) { - return BlockStateArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** @@ -161,14 +172,14 @@ private BlockStateArgument( * * @param sender type */ - public static final class Parser implements NodeSupplyingArgumentParser { + public static final class Parser implements NodeSupplyingArgumentParser { - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(net.minecraft.commands.arguments.blocks.BlockStateArgument.block()) - .map((ctx, blockInput) -> ArgumentParseResult.success((BlockState) blockInput.getState())); + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(BlockStateArgument.block()) + .map((ctx, blockInput) -> ArgumentParseResult.success(new BlockInputImpl(blockInput))); @Override - public @NonNull ArgumentParseResult<@NonNull BlockState> parse( + public @NonNull ArgumentParseResult parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { @@ -188,22 +199,74 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type */ - public static final class Builder extends TypedBuilder> { + public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { - super(BlockState.class, name); + super(BlockInput.class, name); } @Override - public @NonNull BlockStateArgument build() { - return new BlockStateArgument<>( + public @NonNull BlockInputArgument build() { + return new BlockInputArgument<>( this.isRequired(), this.getName(), this.getDefaultValue(), @@ -212,6 +275,24 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault( + final @NonNull BlockState defaultState, + final @Nullable DataContainer defaultExtraData + ) { + final String value = PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() + .apply(RegistryTypes.BLOCK_TYPE.get(), defaultState) + + (defaultExtraData == null ? "" : NBTTranslator.INSTANCE.translate(defaultExtraData).toString()); + return this.asOptionalWithDefault(value); + } + /** * Sets the command argument to be optional, with the specified default value. * @@ -220,8 +301,7 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull BlockState defaultValue) { - return this.asOptionalWithDefault(PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() - .apply(RegistryTypes.BLOCK_TYPE.get(), defaultValue)); + return this.asOptionalWithDefault(defaultValue, null); } /** diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java new file mode 100644 index 00000000..ce12f007 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java @@ -0,0 +1,216 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.BlockPredicate; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.pattern.BlockInWorld; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.common.util.VecHelper; + +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Predicate; + +/** + * An argument for parsing {@link BlockPredicate BlockPredicates}. + * + * @param sender type + */ +public final class BlockPredicateArgument extends CommandArgument { + + private BlockPredicateArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + BlockPredicate.class, + suggestionsProvider, + defaultDescription + ); + } + + /** + * Create a new required {@link BlockPredicateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link BlockPredicateArgument} + */ + public static @NonNull BlockPredicateArgument of(final @NonNull String name) { + return BlockPredicateArgument.builder(name).build(); + } + + /** + * Create a new optional {@link BlockPredicateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link BlockPredicateArgument} + */ + public static @NonNull BlockPredicateArgument optional(final @NonNull String name) { + return BlockPredicateArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + /** + * Parser for {@link BlockPredicate}. + * + * @param sender type + */ + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() + ).map((ctx, result) -> { + final CommandSourceStack commandSourceStack = + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); + try { + return ArgumentParseResult.success( + new BlockPredicateImpl(result.create(commandSourceStack.getLevel().getTagManager())) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull BlockPredicate> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.BLOCK_PREDICATE.get().createNode(); + } + + private static final class BlockPredicateImpl implements BlockPredicate { + + private final Predicate predicate; + + BlockPredicateImpl(final @NonNull Predicate predicate) { + this.predicate = predicate; + } + + private boolean testImpl(final @NonNull ServerLocation location, final boolean loadChunks) { + return this.predicate.test(new BlockInWorld( + (ServerLevel) location.world(), + VecHelper.toBlockPos(location.position()), + loadChunks + )); + } + + @Override + public boolean test(final @NonNull ServerLocation location) { + return this.testImpl(location, false); + } + + @Override + public @NonNull BlockPredicate loadChunks() { + return new BlockPredicate() { + @Override + public @NonNull BlockPredicate loadChunks() { + return this; + } + + @Override + public boolean test(final @NonNull ServerLocation location) { + return BlockPredicateImpl.this.testImpl(location, true); + } + }; + } + + } + + } + + /** + * Builder for {@link BlockPredicateArgument}. + * + * @param sender type + */ + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(BlockPredicate.class, name); + } + + @Override + public @NonNull BlockPredicateArgument build() { + return new BlockPredicateArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java new file mode 100644 index 00000000..57a78c97 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java @@ -0,0 +1,212 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.argument; + +import cloud.commandframework.ArgumentDescription; +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.ItemStackPredicate; +import com.mojang.brigadier.context.StringRange; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.item.ItemPredicateArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.item.inventory.ItemStack; + +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Predicate; + +/** + * An argument for parsing {@link ItemStackPredicate ItemStackPredicates}. + * + * @param sender type + */ +public final class ItemStackPredicateArgument extends CommandArgument { + + private ItemStackPredicateArgument( + final boolean required, + final @NonNull String name, + final @NonNull String defaultValue, + final @Nullable BiFunction, String, List> suggestionsProvider, + final @NonNull ArgumentDescription defaultDescription + ) { + super( + required, + name, + new Parser<>(), + defaultValue, + ItemStackPredicate.class, + suggestionsProvider, + defaultDescription + ); + } + + /** + * Create a new required {@link ItemStackPredicateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ItemStackPredicateArgument} + */ + public static @NonNull ItemStackPredicateArgument of(final @NonNull String name) { + return ItemStackPredicateArgument.builder(name).build(); + } + + /** + * Create a new optional {@link ItemStackPredicateArgument}. + * + * @param name argument name + * @param sender type + * @return a new {@link ItemStackPredicateArgument} + */ + public static @NonNull ItemStackPredicateArgument optional(final @NonNull String name) { + return ItemStackPredicateArgument.builder(name).asOptional().build(); + } + + /** + * Create a new {@link Builder}. + * + * @param name argument name + * @param sender type + * @return a new {@link Builder} + */ + public static @NonNull Builder builder(final @NonNull String name) { + return new Builder<>(name); + } + + /** + * Parser for {@link ItemStackPredicate}. + * + * @param sender type + */ + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + ItemPredicateArgument.itemPredicate() + ).map((ctx, result) -> { + final CommandSourceStack commandSourceStack = + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); + try { + final com.mojang.brigadier.context.CommandContext dummyContext = + createDummyContext(ctx, commandSourceStack); + return ArgumentParseResult.success(new ItemStackPredicateImpl(result.create(dummyContext))); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + }); + + @Override + public @NonNull ArgumentParseResult<@NonNull ItemStackPredicate> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final Queue<@NonNull String> inputQueue + ) { + return this.mappedParser.parse(commandContext, inputQueue); + } + + @Override + public @NonNull List<@NonNull String> suggestions( + final @NonNull CommandContext commandContext, + final @NonNull String input + ) { + return this.mappedParser.suggestions(commandContext, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return ClientCompletionKeys.ITEM_PREDICATE.get().createNode(); + } + + private static final class ItemStackPredicateImpl implements ItemStackPredicate { + + private final Predicate predicate; + + ItemStackPredicateImpl(final @NonNull Predicate predicate) { + this.predicate = predicate; + } + + @SuppressWarnings("ConstantConditions") + @Override + public boolean test(final @NonNull ItemStack itemStack) { + return this.predicate.test((net.minecraft.world.item.ItemStack) (Object) itemStack); + } + + } + + private static com.mojang.brigadier.context.@NonNull CommandContext createDummyContext( + final @NonNull CommandContext ctx, + final @NonNull CommandSourceStack commandSourceStack + ) { + return new com.mojang.brigadier.context.CommandContext<>( + commandSourceStack, + ctx.getRawInputJoined(), + Collections.emptyMap(), + null, + null, + Collections.emptyList(), + StringRange.at(0), + null, + null, + false + ); + } + + } + + /** + * Builder for {@link ItemStackPredicateArgument}. + * + * @param sender type + */ + public static final class Builder extends TypedBuilder> { + + Builder(final @NonNull String name) { + super(ItemStackPredicate.class, name); + } + + @Override + public @NonNull ItemStackPredicateArgument build() { + return new ItemStackPredicateArgument<>( + this.isRequired(), + this.getName(), + this.getDefaultValue(), + this.getSuggestionsProvider(), + this.getDefaultDescription() + ); + } + + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java similarity index 60% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java rename to cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java index 3eaaf2b0..de995bb6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackSnapshotArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java @@ -30,28 +30,33 @@ import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import cloud.commandframework.sponge.data.ProtoItemStack; +import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.kyori.adventure.util.ComponentMessageThrowable; import net.minecraft.commands.arguments.item.ItemArgument; import net.minecraft.commands.arguments.item.ItemInput; +import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.registry.DefaultedRegistryReference; +import org.spongepowered.common.data.persistence.NBTTranslator; +import java.lang.reflect.Field; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; /** - * An argument for parsing {@link ItemStackSnapshot ItemStackSnapshots} from a {@link ItemType} identifier + * An argument for parsing {@link ProtoItemStack ProtoItemStacks} from an {@link ItemType} identifier * and optional NBT data. * - *

    Resulting snapshots will always have a stack size of {@code 1}.

    - * *

    Example input strings:

    *
      *
    • {@code apple}
    • @@ -61,9 +66,9 @@ * * @param sender type */ -public final class ItemStackSnapshotArgument extends CommandArgument { +public final class ProtoItemStackArgument extends CommandArgument { - private ItemStackSnapshotArgument( + private ProtoItemStackArgument( final boolean required, final @NonNull String name, final @NonNull String defaultValue, @@ -75,92 +80,92 @@ private ItemStackSnapshotArgument( name, new Parser<>(), defaultValue, - ItemStackSnapshot.class, + ProtoItemStack.class, suggestionsProvider, defaultDescription ); } /** - * Create a new required {@link ItemStackSnapshotArgument}. + * Create a new required {@link ProtoItemStackArgument}. * * @param name argument name * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument of(final @NonNull String name) { - return ItemStackSnapshotArgument.builder(name).build(); + public static @NonNull ProtoItemStackArgument of(final @NonNull String name) { + return ProtoItemStackArgument.builder(name).build(); } /** - * Create a new optional {@link ItemStackSnapshotArgument}. + * Create a new optional {@link ProtoItemStackArgument}. * * @param name argument name * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument optional(final @NonNull String name) { - return ItemStackSnapshotArgument.builder(name).asOptional().build(); + public static @NonNull ProtoItemStackArgument optional(final @NonNull String name) { + return ProtoItemStackArgument.builder(name).asOptional().build(); } /** - * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * Create a new optional {@link ProtoItemStackArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument optional( + public static @NonNull ProtoItemStackArgument optional( final @NonNull String name, final @NonNull ItemStackSnapshot defaultValue ) { - return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** - * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * Create a new optional {@link ProtoItemStackArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument optional( + public static @NonNull ProtoItemStackArgument optional( final @NonNull String name, final @NonNull ItemStack defaultValue ) { - return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** - * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * Create a new optional {@link ProtoItemStackArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument optional( + public static @NonNull ProtoItemStackArgument optional( final @NonNull String name, final @NonNull ItemType defaultValue ) { - return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** - * Create a new optional {@link ItemStackSnapshotArgument} with the specified default value. + * Create a new optional {@link ProtoItemStackArgument} with the specified default value. * * @param name argument name * @param defaultValue default value * @param sender type - * @return a new {@link ItemStackSnapshotArgument} + * @return a new {@link ProtoItemStackArgument} */ - public static @NonNull ItemStackSnapshotArgument optional( + public static @NonNull ProtoItemStackArgument optional( final @NonNull String name, final @NonNull DefaultedRegistryReference defaultValue ) { - return ItemStackSnapshotArgument.builder(name).asOptionalWithDefault(defaultValue).build(); + return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); } /** @@ -180,21 +185,14 @@ private ItemStackSnapshotArgument( * * @param sender type */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(ItemArgument.item()).map((ctx, itemInput) -> { - try { - return ArgumentParseResult.success( - ((ItemStack) (Object) itemInput.createItemStack(1, true)).createSnapshot() - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - }); + public static final class Parser implements NodeSupplyingArgumentParser { + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(ItemArgument.item()) + .map((ctx, itemInput) -> ArgumentParseResult.success(new ProtoItemStackImpl(itemInput))); @Override - public @NonNull ArgumentParseResult<@NonNull ItemStackSnapshot> parse( + public @NonNull ArgumentParseResult<@NonNull ProtoItemStack> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { @@ -214,22 +212,81 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type */ - public static final class Builder extends TypedBuilder> { + public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { - super(ItemStackSnapshot.class, name); + super(ProtoItemStack.class, name); } @Override - public @NonNull ItemStackSnapshotArgument build() { - return new ItemStackSnapshotArgument<>( + public @NonNull ProtoItemStackArgument build() { + return new ProtoItemStackArgument<>( this.isRequired(), this.getName(), this.getDefaultValue(), diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java index 14219bbb..6bcc6ca7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java @@ -22,6 +22,6 @@ // SOFTWARE. // /** - * Arguments for the Sponge API 8 environment. + * Arguments for the Sponge 8 environment. */ package cloud.commandframework.sponge.argument; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java new file mode 100644 index 00000000..ef7c39c2 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java @@ -0,0 +1,77 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.world.BlockChangeFlag; +import org.spongepowered.api.world.server.ServerLocation; + +/** + * Intermediary result for an argument which parses a {@link BlockState} and optional extra NBT data. + */ +public interface BlockInput { + + /** + * Get the parsed {@link BlockState}. + * + * @return the {@link BlockState} + */ + @NonNull BlockState blockState(); + + /** + * Get any extra data besides the {@link BlockState} that may have been parsed. + * + *

      Will return {@code null} if there is no extra data.

      + * + * @return the extra data or {@code null} + */ + @Nullable DataContainer extraData(); + + /** + * Replace the block at the given {@link ServerLocation} with the parsed {@link BlockState}, + * and if the placed block is a {@link org.spongepowered.api.block.entity.BlockEntity}, applies any + * extra NBT data from {@link #extraData()}. + * + * @param location location + * @return return whether the block change was successful + * @see ServerLocation#setBlock(BlockState) + */ + boolean place(@NonNull ServerLocation location); + + /** + * Replace the block at the given {@link ServerLocation} with the parsed {@link BlockState}, + * and if the placed block is a {@link org.spongepowered.api.block.entity.BlockEntity}, applies any + * extra NBT data from {@link #extraData()}. + * + * @param location location + * @param flag the various {@link BlockChangeFlag change flags} controlling some interactions + * @return return whether the block change was successful + * @see ServerLocation#setBlock(BlockState, BlockChangeFlag) + */ + boolean place(@NonNull ServerLocation location, @NonNull BlockChangeFlag flag); + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java new file mode 100644 index 00000000..5ba85654 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java @@ -0,0 +1,52 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.api.world.server.ServerWorld; + +import java.util.function.Predicate; + +/** + * A {@link Predicate} for blocks in a {@link ServerWorld}, parsed from user input. + * + *

      By default, a parsed {@link BlockPredicate} will not load chunks to perform tests. It will simply + * return {@code false} when attempting to test a block in unloaded chunks.

      + * + *

      To get a {@link BlockPredicate} which will load chunks, use {@link #loadChunks()}.

      + */ +public interface BlockPredicate extends Predicate { + + /** + * Get a version of this {@link BlockPredicate} which will load chunks in order to perform + * tests. + * + *

      If this {@link BlockPredicate} already loads chunks, it will simply return itself.

      + * + * @return a {@link BlockPredicate} which loads chunks + */ + @NonNull BlockPredicate loadChunks(); + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java new file mode 100644 index 00000000..bd74bb83 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java @@ -0,0 +1,35 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import org.spongepowered.api.item.inventory.ItemStack; + +import java.util.function.Predicate; + +/** + * A {@link Predicate} for {@link ItemStack ItemStacks}, parsed from user input. + */ +public interface ItemStackPredicate extends Predicate { + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java new file mode 100644 index 00000000..aa28b122 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java @@ -0,0 +1,84 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.data; + +import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.item.ItemType; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.ItemStackSnapshot; + +/** + * Result for an argument which parses an {@link ItemType} and optional extra NBT data. + */ +public interface ProtoItemStack { + + /** + * Get the {@link ItemType} of this {@link ProtoItemStack}. + * + * @return the {@link ItemType} + */ + @NonNull ItemType itemType(); + + /** + * Get any extra data besides the {@link ItemType} that may have been parsed. + * + *

      Will return {@code null} if there is no extra data.

      + * + * @return the extra data or {@code null} + */ + @Nullable DataContainer extraData(); + + /** + * Create a new {@link ItemStack} from the state of this {@link ProtoItemStack}. + * + *

      A {@link ComponentMessageRuntimeException} will be thrown if the stack size was too large for the + * provided {@link ItemType}.

      + * + * @param stackSize stack size + * @param respectMaximumStackSize whether to respect {@link ItemType#maxStackQuantity()} + * @return the created {@link ItemStack} + * @throws ComponentMessageRuntimeException if the {@link ItemStack} could not be created + */ + @NonNull ItemStack createItemStack(int stackSize, boolean respectMaximumStackSize) throws ComponentMessageRuntimeException; + + /** + * Create a new {@link ItemStackSnapshot} from the state of this {@link ProtoItemStack}. + * + *

      A {@link ComponentMessageRuntimeException} will be thrown if the stack size was too large for the + * provided {@link ItemType}.

      + * + * @param stackSize stack size + * @param respectMaximumStackSize whether to respect {@link ItemType#maxStackQuantity()} + * @return the created {@link ItemStackSnapshot} + * @throws ComponentMessageRuntimeException if the {@link ItemStackSnapshot} could not be created + */ + @NonNull ItemStackSnapshot createItemStackSnapshot( + int stackSize, + boolean respectMaximumStackSize + ) throws ComponentMessageRuntimeException; + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java new file mode 100644 index 00000000..1cc44bc8 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java @@ -0,0 +1,97 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.exception; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; +import net.kyori.adventure.util.ComponentMessageThrowable; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * A subclass of {@link RuntimeException} that contains a rich message that is an instance of + * {@link Component} rather than a String. This allows formatted and localized + * exception messages. + */ +public class ComponentMessageRuntimeException extends RuntimeException implements ComponentMessageThrowable { + + private static final long serialVersionUID = 2152146048432114275L; + + private final @Nullable Component message; + + /** + * Constructs a new {@link ComponentMessageRuntimeException}. + */ + public ComponentMessageRuntimeException() { + this.message = null; + } + + /** + * Constructs a new {@link ComponentMessageRuntimeException} with the given message. + * + * @param message The detail message + */ + public ComponentMessageRuntimeException(final @Nullable ComponentLike message) { + this.message = message == null ? null : message.asComponent(); + } + + /** + * Constructs a new {@link ComponentMessageRuntimeException} with the given message and + * cause. + * + * @param message The detail message + * @param throwable The cause + */ + public ComponentMessageRuntimeException(final @Nullable ComponentLike message, final @Nullable Throwable throwable) { + super(throwable); + this.message = message == null ? null : message.asComponent(); + } + + /** + * Constructs a new {@link ComponentMessageRuntimeException} with the given cause. + * + * @param throwable The cause + */ + public ComponentMessageRuntimeException(final @Nullable Throwable throwable) { + super(throwable); + this.message = null; + } + + /** + * {@inheritDoc} + */ + @Override + public @Nullable String getMessage() { + return PlainComponentSerializer.plain().serializeOrNull(this.message); + } + + /** + * {@inheritDoc} + */ + @Override + public @Nullable Component componentMessage() { + return this.message; + } + +} diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java new file mode 100644 index 00000000..0ceaaf45 --- /dev/null +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java @@ -0,0 +1,27 @@ +// +// MIT License +// +// Copyright (c) 2021 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +/** + * Exception types for cloud-sponge. + */ +package cloud.commandframework.sponge.exception; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java index ab1a0196..9a7e0cdc 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java @@ -22,6 +22,6 @@ // SOFTWARE. // /** - * Cloud for Sponge API v8 + * Cloud for Sponge 8 */ package cloud.commandframework.sponge; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index c4f093a0..18cd209a 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -23,6 +23,7 @@ // package cloud.commandframework.examples.sponge; +import cloud.commandframework.ArgumentDescription; import cloud.commandframework.Command; import cloud.commandframework.arguments.standard.DoubleArgument; import cloud.commandframework.arguments.standard.IntegerArgument; @@ -32,20 +33,27 @@ import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; -import cloud.commandframework.sponge.argument.BlockStateArgument; +import cloud.commandframework.sponge.argument.BlockInputArgument; +import cloud.commandframework.sponge.argument.BlockPredicateArgument; import cloud.commandframework.sponge.argument.DataContainerArgument; -import cloud.commandframework.sponge.argument.ItemStackSnapshotArgument; +import cloud.commandframework.sponge.argument.ItemStackPredicateArgument; import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; import cloud.commandframework.sponge.argument.NamedTextColorArgument; import cloud.commandframework.sponge.argument.OperatorArgument; +import cloud.commandframework.sponge.argument.ProtoItemStackArgument; import cloud.commandframework.sponge.argument.RegistryEntryArgument; import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; import cloud.commandframework.sponge.argument.UserArgument; import cloud.commandframework.sponge.argument.Vector3dArgument; import cloud.commandframework.sponge.argument.Vector3iArgument; import cloud.commandframework.sponge.argument.WorldArgument; +import cloud.commandframework.sponge.data.BlockInput; +import cloud.commandframework.sponge.data.BlockPredicate; +import cloud.commandframework.sponge.data.ItemStackPredicate; import cloud.commandframework.sponge.data.MultipleEntitySelector; +import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.data.SinglePlayerSelector; +import cloud.commandframework.types.tuples.Pair; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; import com.google.inject.Injector; @@ -58,7 +66,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.block.BlockState; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.parameter.managed.operator.Operators; @@ -75,13 +82,12 @@ import org.spongepowered.api.item.enchantment.Enchantment; import org.spongepowered.api.item.enchantment.EnchantmentType; import org.spongepowered.api.item.inventory.ItemStack; -import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.item.inventory.Slot; import org.spongepowered.api.item.inventory.entity.Hotbar; import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; import org.spongepowered.api.registry.RegistryHolder; import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.service.permission.Subject; +import org.spongepowered.api.world.Location; import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.api.world.server.ServerLocation; @@ -177,7 +183,7 @@ private void registerCommands() { .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { - final Subject subject = ctx.getSender().subject(); + final Object subject = ctx.getSender().cause().root(); if (!(subject instanceof Player)) { ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); return; @@ -241,7 +247,7 @@ private void registerCommands() { .argument(OperatorArgument.of("operator")) .argument(DoubleArgument.of("value")) .handler(ctx -> { - final Subject subject = ctx.getSender().subject(); + final Object subject = ctx.getSender().cause().root(); if (!(subject instanceof Player)) { // todo: a solution to this ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); return; @@ -276,12 +282,23 @@ private void registerCommands() { .handler(ctx -> { ctx.getSender().audience().sendMessage(text(ctx.get("world").key().asString())); })); - this.commandManager.command(cloud.literal("give_item") - .argument(SinglePlayerSelectorArgument.of("player")) - .argument(ItemStackSnapshotArgument.of("item")) + this.commandManager.command(cloud.literal("test_item") + .argument(ProtoItemStackArgument.of("item")) + .literal("is") + .argument(ItemStackPredicateArgument.of("predicate")) .handler(ctx -> { - final Player player = ctx.get("player").getSingle(); - player.inventory().offer(ctx.get("item").createStack()); + final ItemStack item = ctx.get("item").createItemStack(1, true); + final ItemStackPredicate predicate = ctx.get("predicate"); + final Component message = text(builder -> { + builder.append(item.get(Keys.DISPLAY_NAME).orElse(item.type().asComponent())) + .append(space()); + if (predicate.test(item)) { + builder.append(text("passes!", GREEN)); + return; + } + builder.append(text("does not pass!", RED)); + }); + ctx.getSender().audience().sendMessage(message); })); this.commandManager.command(cloud.literal("test_entity_type") .argument(RegistryEntryArgument.of("type", new TypeToken>() { @@ -291,8 +308,8 @@ private void registerCommands() { })); final Function, RegistryHolder> holderFunction = ctx -> ctx.getSender() .location() - .orElse(Sponge.server().worldManager().defaultWorld().location(0, 0, 0)) - .world() + .map(Location::world) + .orElse(Sponge.server().worldManager().defaultWorld()) .registries(); this.commandManager.command(cloud.literal("test_biomes") .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) @@ -364,27 +381,72 @@ private void registerCommands() { this.commandManager.command(cloud.literal("setblock") .permission("cloud.setblock") .argument(Vector3iArgument.of("position")) - .argument(BlockStateArgument.of("blockstate")) + .argument(BlockInputArgument.of("block")) .handler(ctx -> { final Vector3i position = ctx.get("position"); - final BlockState blockState = ctx.get("blockstate"); + final BlockInput input = ctx.get("block"); final Optional location = ctx.getSender().location(); if (location.isPresent()) { - location.get().world().setBlock(position, blockState); + final ServerWorld world = location.get().world(); + input.place(world.location(position)); ctx.getSender().audience().sendMessage(text("set block!")); } else { ctx.getSender().audience().sendMessage(text("no location!")); } })); - this.commandManager.command(cloud.literal("blockstate") - .argument(BlockStateArgument.of("blockstate")) + this.commandManager.command(cloud.literal("blockinput") + .argument(BlockInputArgument.of("block")) .handler(ctx -> { - final BlockState blockState = ctx.get("blockstate"); + final BlockInput input = ctx.get("block"); ctx.getSender().audience().sendMessage(text( PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() - .apply(RegistryTypes.BLOCK_TYPE.get(), blockState) + .apply(RegistryTypes.BLOCK_TYPE.get(), input.blockState()) )); })); + this.commandManager.command(this.commandManager.commandBuilder("gib") + .permission("cloud.gib") + .argumentPair( + "itemstack", + TypeToken.get(ItemStack.class), + Pair.of("item", "amount"), + Pair.of(ProtoItemStack.class, Integer.class), + (sender, pair) -> { + final ProtoItemStack proto = pair.getFirst(); + final int amount = pair.getSecond(); + return proto.createItemStack(amount, true); + }, + ArgumentDescription.of("The ItemStack to give") + ) + .handler(ctx -> ((Player) ctx.getSender().cause().root()).inventory().offer(ctx.get("itemstack")))); + this.commandManager.command(cloud.literal("replace") + .permission(cause -> { + // works but error message is ugly + return cause.cause().root() instanceof Player; + }) + .argument(BlockPredicateArgument.of("predicate")) + .argument(IntegerArgument.of("radius")) + .argument(BlockInputArgument.of("replacement")) + .handler(ctx -> { + final BlockPredicate predicate = ctx.get("predicate"); + final int radius = ctx.get("radius"); + final BlockInput replacement = ctx.get("replacement"); + + // its a player so get is fine + final ServerLocation loc = ctx.getSender().location().get(); + final ServerWorld world = loc.world(); + final Vector3d vec = loc.position(); + + for (double x = vec.x() - radius; x < vec.x() + radius; x++) { + for (double y = vec.y() - radius; y < vec.y() + radius; y++) { + for (double z = vec.z() - radius; z < vec.z() + radius; z++) { + final ServerLocation location = world.location(x, y, z); + if (predicate.test(location)) { + location.setBlock(replacement.blockState()); + } + } + } + } + })); } } From 2912c05f205ed34a686156c5141164049425a0dd Mon Sep 17 00:00:00 2001 From: jmp Date: Sun, 2 May 2021 21:16:41 -0700 Subject: [PATCH 25/72] sponge: Update for plugin-spi changes --- .../cloud/commandframework/sponge/CloudSpongeCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index de6b41c4..2725c66d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -147,13 +147,13 @@ private void handleCommandException(final C cloudSender, final Audience audience (CommandExecutionException) throwable, (c, e) -> { audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.owningPluginContainer().getLogger() + this.commandManager.owningPluginContainer().logger() .error("Exception executing command handler", throwable.getCause()); } ); } else { audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.owningPluginContainer().getLogger() + this.commandManager.owningPluginContainer().logger() .error("An unhandled exception was thrown during command execution", throwable); } } From bff10a89516ad0e2c3438500bd259db2d12cc90c Mon Sep 17 00:00:00 2001 From: jmp Date: Tue, 4 May 2021 15:54:21 -0700 Subject: [PATCH 26/72] sponge: Update for command api renames --- .../sponge/CloudSpongeCommand.java | 9 +++-- .../sponge/SpongeParserMapper.java | 36 +++++++++---------- .../sponge/argument/BlockInputArgument.java | 4 +-- .../argument/BlockPredicateArgument.java | 4 +-- .../sponge/argument/ComponentArgument.java | 4 +-- .../argument/DataContainerArgument.java | 4 +-- .../sponge/argument/GameProfileArgument.java | 4 +-- .../GameProfileCollectionArgument.java | 4 +-- .../argument/ItemStackPredicateArgument.java | 4 +-- .../MultipleEntitySelectorArgument.java | 4 +-- .../MultiplePlayerSelectorArgument.java | 15 ++++---- .../argument/NamedTextColorArgument.java | 4 +-- .../sponge/argument/OperatorArgument.java | 4 +-- .../argument/ProtoItemStackArgument.java | 4 +-- .../argument/RegistryEntryArgument.java | 24 ++++++------- .../sponge/argument/ResourceKeyArgument.java | 4 +-- .../SingleEntitySelectorArgument.java | 4 +-- .../SinglePlayerSelectorArgument.java | 15 ++++---- .../sponge/argument/UserArgument.java | 4 +-- .../sponge/argument/Vector2dArgument.java | 4 +-- .../sponge/argument/Vector2iArgument.java | 4 +-- .../sponge/argument/Vector3dArgument.java | 4 +-- .../sponge/argument/Vector3iArgument.java | 4 +-- .../sponge/argument/WorldArgument.java | 4 +-- .../sponge/data/MultiplePlayerSelector.java | 6 ++-- .../sponge/data/SinglePlayerSelector.java | 7 ++-- .../examples/sponge/CloudExamplePlugin.java | 9 ++--- 27 files changed, 103 insertions(+), 94 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 2725c66d..41c496c4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -44,6 +44,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.Command; import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.CommandCompletion; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.parameter.ArgumentReader; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; @@ -55,6 +56,7 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; +import java.util.stream.Collectors; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; @@ -164,11 +166,14 @@ private static Component getMessage(final Throwable throwable) { } @Override - public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { + public List complete( + final @NonNull CommandCause cause, + final ArgumentReader.@NonNull Mutable arguments + ) { return this.commandManager.suggest( this.commandManager.backwardsCauseMapper().apply(cause), this.formatCommandForSuggestions(arguments.input()) - ); + ).stream().map(CommandCompletion::of).collect(Collectors.toList()); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index de6b9840..f0aa95de 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -40,8 +40,8 @@ import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import java.util.HashMap; import java.util.Map; @@ -78,7 +78,7 @@ CommandTreeNode.Argument> mapArgument(fina final CommandTreeNode.Argument> result = this.mapParser(value.getParser()); final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); if (customSuggestionsProvider) { - result.customSuggestions(); + result.customCompletions(); } return result; } @@ -95,14 +95,14 @@ CommandTreeNode.Argument> mapParser(final final CommandTreeNode.Argument> apply = (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); if (mapper.cloudSuggestions) { - apply.customSuggestions(); + apply.customCompletions(); return apply; } result = apply; } else if (parser instanceof NodeSupplyingArgumentParser) { result = ((NodeSupplyingArgumentParser) parser).node(); } else { - result = ClientCompletionKeys.STRING.get().createNode().customSuggestions().word(); + result = CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word(); } return result; } @@ -112,31 +112,31 @@ private void initStandardMappers() { }, builder -> builder.to(stringParser -> { final StringArgument.StringMode mode = stringParser.getStringMode(); if (mode == StringArgument.StringMode.SINGLE) { - return ClientCompletionKeys.STRING.get().createNode().customSuggestions().word(); + return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word(); } else if (mode == StringArgument.StringMode.QUOTED) { - return ClientCompletionKeys.STRING.get().createNode().customSuggestions(); + return CommandTreeNodeTypes.STRING.get().createNode().customCompletions(); } else if (mode == StringArgument.StringMode.GREEDY) { - return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); + return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); } throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(byteParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); node.min((int) byteParser.getMin()); node.max((int) byteParser.getMax()); return node; })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(shortParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); node.min((int) shortParser.getMin()); node.max((int) shortParser.getMax()); return node; })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(integerParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.INTEGER.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); if (integerParser.hasMin()) { node.min(integerParser.getMin()); } @@ -147,7 +147,7 @@ private void initStandardMappers() { })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(floatParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.FLOAT.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.FLOAT.get().createNode(); if (floatParser.hasMin()) { node.min(floatParser.getMin()); } @@ -158,7 +158,7 @@ private void initStandardMappers() { })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(doubleParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.DOUBLE.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.DOUBLE.get().createNode(); if (doubleParser.hasMin()) { node.min(doubleParser.getMin()); } @@ -169,7 +169,7 @@ private void initStandardMappers() { })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(longParser -> { - final CommandTreeNode.Range node = ClientCompletionKeys.LONG.get().createNode(); + final CommandTreeNode.Range node = CommandTreeNodeTypes.LONG.get().createNode(); if (longParser.hasMin()) { node.min(longParser.getMin()); } @@ -180,19 +180,19 @@ private void initStandardMappers() { })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(booleanParser -> { - return ClientCompletionKeys.BOOL.get().createNode(); + return CommandTreeNodeTypes.BOOL.get().createNode(); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(flagArgumentParser -> { - return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); + return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(stringArrayParser -> { - return ClientCompletionKeys.STRING.get().createNode().customSuggestions().greedy(); + return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(uuidParser -> { - return ClientCompletionKeys.UUID.get().createNode(); + return CommandTreeNodeTypes.UUID.get().createNode(); })); } @@ -272,7 +272,7 @@ public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { public interface MappingBuilder> { /** - * Set whether to use cloud suggestions, or to fall back onto {@link ClientCompletionKeys}. By default, this is set to + * Set whether to use cloud suggestions, or to fall back onto {@link CommandTreeNodeTypes}. By default, this is set to * {@code false}. * * @param cloudSuggestions whether to use cloud suggestions diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java index 1f21a2fa..c71bf226 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java @@ -38,8 +38,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.BlockType; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.RegistryTypes; @@ -196,7 +196,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.BLOCK_STATE.get().createNode(); + return CommandTreeNodeTypes.BLOCK_STATE.get().createNode(); } private static final class BlockInputImpl implements BlockInput { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java index ce12f007..8ff506ab 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java @@ -38,8 +38,8 @@ import net.minecraft.world.level.block.state.pattern.BlockInWorld; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.common.util.VecHelper; @@ -146,7 +146,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.BLOCK_PREDICATE.get().createNode(); + return CommandTreeNodeTypes.BLOCK_PREDICATE.get().createNode(); } private static final class BlockPredicateImpl implements BlockPredicate { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java index c547cdd9..d234784a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -34,8 +34,8 @@ import net.kyori.adventure.text.ComponentLike; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.adventure.SpongeAdventure; import java.util.List; @@ -138,7 +138,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.COMPONENT.get().createNode(); + return CommandTreeNodeTypes.COMPONENT.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java index 0c5eae28..1bbff9b4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java @@ -34,8 +34,8 @@ import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.common.data.persistence.NBTTranslator; @@ -139,7 +139,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.NBT_COMPOUND_TAG.get().createNode(); + return CommandTreeNodeTypes.NBT_COMPOUND_TAG.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index 5af24358..14acf48f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -37,8 +37,8 @@ import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; @@ -150,7 +150,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.GAME_PROFILE.get().createNode(); + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index 3dfc0bd6..9822b1eb 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -36,8 +36,8 @@ import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; @@ -156,7 +156,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.GAME_PROFILE.get().createNode(); + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java index 57a78c97..c9210c55 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java @@ -38,8 +38,8 @@ import net.minecraft.commands.arguments.item.ItemPredicateArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.item.inventory.ItemStack; import java.util.Collections; @@ -146,7 +146,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ITEM_PREDICATE.get().createNode(); + return CommandTreeNodeTypes.ITEM_PREDICATE.get().createNode(); } private static final class ItemStackPredicateImpl implements ItemStackPredicate { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 48afb58b..809fa479 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -38,8 +38,8 @@ import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.Entity; @@ -151,7 +151,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ENTITY.get().createNode(); + return CommandTreeNodeTypes.ENTITY.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index 64783a42..b581e4e8 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -38,10 +38,11 @@ import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import java.util.Collection; import java.util.List; @@ -128,11 +129,11 @@ public static final class Parser implements NodeSupplyingArgumentParser players; + final List players; try { players = parsed.findPlayers( ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) - ).stream().map(p -> (Player) p).collect(Collectors.toList()); + ).stream().map(p -> (ServerPlayer) p).collect(Collectors.toList()); } catch (final CommandSyntaxException ex) { return ArgumentParseResult.failure(ex); } @@ -151,7 +152,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ENTITY.get().createNode().playersOnly(); + return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly(); } } @@ -184,12 +185,12 @@ private static final class MultiplePlayerSelectorImpl implements MultiplePlayerS private final Selector selector; private final String inputString; - private final Collection result; + private final Collection result; private MultiplePlayerSelectorImpl( final Selector selector, final String inputString, - final Collection result + final Collection result ) { this.selector = selector; this.inputString = inputString; @@ -207,7 +208,7 @@ private MultiplePlayerSelectorImpl( } @Override - public @NonNull Collection get() { + public @NonNull Collection get() { return this.result; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index 0ea6921d..ef06d796 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -33,8 +33,8 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import java.util.ArrayList; import java.util.List; @@ -151,7 +151,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.COLOR.get().createNode(); + return CommandTreeNodeTypes.COLOR.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 1f05e56b..d9c2a1c2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -33,8 +33,8 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.parameter.managed.operator.Operator; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.RegistryTypes; @@ -179,7 +179,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.OPERATION.get().createNode(); + return CommandTreeNodeTypes.OPERATION.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java index de995bb6..922058e8 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java @@ -39,8 +39,8 @@ import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.inventory.ItemStack; @@ -209,7 +209,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ITEM_STACK.get().createNode(); + return CommandTreeNodeTypes.ITEM_STACK.get().createNode(); } private static final class ProtoItemStackImpl implements ProtoItemStack { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index c0c15f2a..d62cc1e0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -35,9 +35,9 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; -import org.spongepowered.api.command.registrar.tree.ClientSuggestionProviders; +import org.spongepowered.api.command.registrar.tree.CommandCompletionProviders; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.registry.DefaultedRegistryType; import org.spongepowered.api.registry.Registry; import org.spongepowered.api.registry.RegistryEntry; @@ -511,23 +511,23 @@ private Registry registry(final @NonNull CommandContext commandContext) { @Override public CommandTreeNode.@NonNull Argument> node() { if (this.registryType.equals(RegistryTypes.SOUND_TYPE)) { - return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode() - .suggestions(ClientSuggestionProviders.AVAILABLE_SOUNDS); + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() + .completions(CommandCompletionProviders.AVAILABLE_SOUNDS); } else if (this.registryType.equals(RegistryTypes.BIOME)) { - return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode() - .suggestions(ClientSuggestionProviders.AVAILABLE_BIOMES); + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() + .completions(CommandCompletionProviders.AVAILABLE_BIOMES); } else if (this.registryType.equals(RegistryTypes.ENTITY_TYPE)) { - return ClientCompletionKeys.ENTITY_SUMMON.get().createNode() - .suggestions(ClientSuggestionProviders.SUMMONABLE_ENTITIES); + return CommandTreeNodeTypes.ENTITY_SUMMON.get().createNode() + .completions(CommandCompletionProviders.SUMMONABLE_ENTITIES); } else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { - return ClientCompletionKeys.ITEM_ENCHANTMENT.get().createNode(); + return CommandTreeNodeTypes.ITEM_ENCHANTMENT.get().createNode(); } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { - return ClientCompletionKeys.MOB_EFFECT.get().createNode(); + return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { // todo: should we use custom suggestions? sponge seems to include non-vanilla dimension types in it's registry. - return ClientCompletionKeys.DIMENSION.get().createNode(); + return CommandTreeNodeTypes.DIMENSION.get().createNode(); } - return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode().customSuggestions(); + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java index 2a745107..2c3d63d2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -31,8 +31,8 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import java.util.List; import java.util.Queue; @@ -134,7 +134,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode(); + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index fafd8327..2e898d57 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -38,8 +38,8 @@ import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.Entity; @@ -149,7 +149,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ENTITY.get().createNode().single(); + return CommandTreeNodeTypes.ENTITY.get().createNode().single(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index ff7f67e7..fb00d869 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -38,10 +38,11 @@ import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import java.util.List; import java.util.Queue; @@ -126,10 +127,10 @@ public static final class Parser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.ENTITY.get().createNode().playersOnly().single(); + return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly().single(); } } @@ -183,12 +184,12 @@ private static final class SinglePlayerSelectorImpl implements SinglePlayerSelec private final Selector selector; private final String inputString; - private final Player result; + private final ServerPlayer result; private SinglePlayerSelectorImpl( final Selector selector, final String inputString, - final Player result + final ServerPlayer result ) { this.selector = selector; this.inputString = inputString; @@ -206,7 +207,7 @@ private SinglePlayerSelectorImpl( } @Override - public @NonNull Player getSingle() { + public @NonNull ServerPlayer getSingle() { return this.result; } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index b281c62c..17b3bc44 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -42,8 +42,8 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.entity.living.player.server.ServerPlayer; @@ -211,7 +211,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.GAME_PROFILE.get().createNode().customSuggestions(); + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode().customCompletions(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java index 4c7b580f..3bf5f6c3 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -37,8 +37,8 @@ import net.minecraft.world.phys.Vec3; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2d; import java.util.List; @@ -207,7 +207,7 @@ public Parser(final boolean centerIntegers) { @Override public CommandTreeNode.@NonNull Argument> node() { - return ClientCompletionKeys.VEC2.get().createNode(); + return CommandTreeNodeTypes.VEC2.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index 6fc387be..e9442dc2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -37,8 +37,8 @@ import net.minecraft.core.BlockPos; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2i; import java.util.List; @@ -158,7 +158,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.COLUMN_POS.get().createNode(); + return CommandTreeNodeTypes.COLUMN_POS.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index 06ab6498..8d3677ec 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -36,8 +36,8 @@ import net.minecraft.commands.arguments.coordinates.Vec3Argument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.util.VecHelper; import org.spongepowered.math.vector.Vector3d; @@ -207,7 +207,7 @@ public Parser(final boolean centerIntegers) { @Override public CommandTreeNode.@NonNull Argument> node() { - return ClientCompletionKeys.VEC3.get().createNode(); + return CommandTreeNodeTypes.VEC3.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index 36367773..91c254fd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -36,8 +36,8 @@ import net.minecraft.commands.arguments.coordinates.Coordinates; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.util.VecHelper; import org.spongepowered.math.vector.Vector3i; @@ -156,7 +156,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.BLOCK_POS.get().createNode(); + return CommandTreeNodeTypes.BLOCK_POS.get().createNode(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 47345b3a..356205ea 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -34,8 +34,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.ClientCompletionKeys; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.api.world.server.WorldManager; @@ -171,7 +171,7 @@ public static final class Parser implements NodeSupplyingArgumentParser> node() { - return ClientCompletionKeys.RESOURCE_LOCATION.get().createNode().customSuggestions(); + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java index 29642f48..5b6255e2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java @@ -23,12 +23,12 @@ // package cloud.commandframework.sponge.data; -import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; /** * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may - * select one or more {@link Player Players}. + * select one or more {@link ServerPlayer Players}. */ -public interface MultiplePlayerSelector extends SelectorWrapper { +public interface MultiplePlayerSelector extends SelectorWrapper { } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java index 41e80065..9039d70e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java @@ -23,11 +23,12 @@ // package cloud.commandframework.sponge.data; -import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; /** - * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may select a single {@link Player}. + * A wrapper for {@link org.spongepowered.api.command.selector.Selector Selectors} which may + * select a single {@link ServerPlayer}. */ -public interface SinglePlayerSelector extends SelectorWrapper.Single { +public interface SinglePlayerSelector extends SelectorWrapper.Single { } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 18cd209a..2555a08d 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -183,7 +183,7 @@ private void registerCommands() { .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { - final Object subject = ctx.getSender().cause().root(); + final Object subject = ctx.getSender().subject(); if (!(subject instanceof Player)) { ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); return; @@ -247,7 +247,7 @@ private void registerCommands() { .argument(OperatorArgument.of("operator")) .argument(DoubleArgument.of("value")) .handler(ctx -> { - final Object subject = ctx.getSender().cause().root(); + final Object subject = ctx.getSender().subject(); if (!(subject instanceof Player)) { // todo: a solution to this ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); return; @@ -417,11 +417,12 @@ private void registerCommands() { }, ArgumentDescription.of("The ItemStack to give") ) - .handler(ctx -> ((Player) ctx.getSender().cause().root()).inventory().offer(ctx.get("itemstack")))); + .handler(ctx -> ((Player) ctx.getSender().subject()).inventory().offer(ctx.get("itemstack")))); this.commandManager.command(cloud.literal("replace") .permission(cause -> { // works but error message is ugly - return cause.cause().root() instanceof Player; + // todo: cause.cause().root() returns DedicatedServer during permission checks? + return cause.subject() instanceof Player; }) .argument(BlockPredicateArgument.of("predicate")) .argument(IntegerArgument.of("radius")) From 5ffc2dc04698b9ad8356518e6a539d841d35ce2a Mon Sep 17 00:00:00 2001 From: jmp Date: Thu, 6 May 2021 22:41:41 -0700 Subject: [PATCH 27/72] sponge: Simplify canExecute check --- .../sponge/CloudSpongeCommand.java | 52 ++----------------- 1 file changed, 5 insertions(+), 47 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 41c496c4..6d464d16 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -54,8 +54,6 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CompletionException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Function; import java.util.stream.Collectors; import static net.kyori.adventure.text.Component.text; @@ -178,51 +176,11 @@ public List complete( @Override public boolean canExecute(final @NonNull CommandCause cause) { - final C sender = this.commandManager.backwardsCauseMapper().apply(cause); - // check whether there are any commands we can execute - final AtomicBoolean result = new AtomicBoolean(false); - visit(this.commandManager.getCommandTree().getNamedNode(this.label), node -> { - if (node.getValue().getOwningCommand() == null) { - return VisitAction.CONTINUE; - } - final boolean permitted = this.commandManager.hasPermission( - sender, - node.getValue().getOwningCommand().getCommandPermission() - ); - if (permitted) { - result.set(true); - return VisitAction.END; - } - return VisitAction.CONTINUE; - }); - return result.get(); - } - - private static void visit( - final CommandTree.Node> node, - final Function>, VisitAction> visitor - ) { - visitImpl(node, visitor); - } - - private static VisitAction visitImpl( - final CommandTree.Node> node, - final Function>, VisitAction> visitor - ) { - if (visitor.apply(node) == VisitAction.END) { - return VisitAction.END; - } - for (final CommandTree.Node> child : node.getChildren()) { - if (visitImpl(child, visitor) == VisitAction.END) { - break; - } - } - return VisitAction.END; - } - - private enum VisitAction { - CONTINUE, - END + final CommandTree.Node> rootNode = this.commandManager.getCommandTree().getNamedNode(this.label); + return this.commandManager.hasPermission( + this.commandManager.backwardsCauseMapper().apply(cause), + (CommandPermission) rootNode.getNodeMeta().getOrDefault("permission", Permission.empty()) + ); } @Override From 9910deca707209abe145c30fce3cc846ea28e5b3 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 5 Jul 2021 04:26:40 -0700 Subject: [PATCH 28/72] build/sponge: Update VanillaGradle to 0.2 --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index 12cc316c..6b84f6d9 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -1,7 +1,7 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { - id("org.spongepowered.gradle.vanilla") version "0.2-SNAPSHOT" + id("org.spongepowered.gradle.vanilla") version "0.2" } dependencies { From 85932b3573d3efe042ac5752be929fd8ffc94748 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 5 Jul 2021 04:27:50 -0700 Subject: [PATCH 29/72] build/sponge: Update SpongeGradle to 1.1.1 --- examples/example-sponge/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 868f933f..e9f220c9 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders import org.spongepowered.plugin.metadata.PluginDependency plugins { - id("org.spongepowered.gradle.plugin") version "1.0.3" + id("org.spongepowered.gradle.plugin") version "1.1.1" id("com.github.johnrengelman.shadow") } @@ -25,9 +25,6 @@ sponge { } tasks { - runServer { - classpath(shadowJar) - } build { dependsOn(shadowJar) } From 85dbceecb663ea36d1d2bff5ba6e756659f0a231 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 5 Jul 2021 04:35:30 -0700 Subject: [PATCH 30/72] sponge: Update for Sponge API changes --- .../sponge/argument/ComponentArgument.java | 5 +++-- .../sponge/argument/NamedTextColorArgument.java | 11 +++-------- .../exception/ComponentMessageRuntimeException.java | 4 ++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java index d234784a..968937e4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -32,6 +32,7 @@ import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; @@ -108,7 +109,7 @@ private ComponentArgument( * Create a new {@link Builder}. * * @param name argument name - * @param sender type + * @param sender type * @return a new {@link Builder} */ public static @NonNull Builder builder(final @NonNull String name) { @@ -173,7 +174,7 @@ public static final class Builder extends TypedBuilder asOptionalWithDefault(final @NonNull ComponentLike defaultValue) { - return this.asOptionalWithDefault(SpongeAdventure.json(defaultValue.asComponent())); + return this.asOptionalWithDefault(GsonComponentSerializer.gson().serialize(defaultValue.asComponent())); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index ef06d796..9994e68a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -32,7 +32,6 @@ import net.minecraft.commands.arguments.ColorArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.Sponge; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; @@ -40,7 +39,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Optional; import java.util.Queue; import java.util.function.BiFunction; @@ -130,13 +128,10 @@ public static final class Parser implements NodeSupplyingArgumentParser inputQueue ) { final String input = inputQueue.peek().toLowerCase(Locale.ROOT); - final Optional color = Sponge.registry() - .adventureRegistry() - .namedColors() - .value(input); - if (color.isPresent()) { + final NamedTextColor color = NamedTextColor.NAMES.value(input); + if (color != null) { inputQueue.remove(); - return ArgumentParseResult.success(color.get()); + return ArgumentParseResult.success(color); } return ArgumentParseResult.failure(ColorArgument.ERROR_INVALID_VALUE.create(input)); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java index 1cc44bc8..324ffcd8 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java @@ -25,7 +25,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.util.ComponentMessageThrowable; import org.checkerframework.checker.nullness.qual.Nullable; @@ -83,7 +83,7 @@ public ComponentMessageRuntimeException(final @Nullable Throwable throwable) { */ @Override public @Nullable String getMessage() { - return PlainComponentSerializer.plain().serializeOrNull(this.message); + return PlainTextComponentSerializer.plainText().serializeOrNull(this.message); } /** From 50ec990de3b528080416d87f3071831a64568a77 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 27 Jul 2021 00:54:44 -0700 Subject: [PATCH 31/72] Update for Sponge API changes --- .../sponge/SpongeCommandManager.java | 2 -- .../sponge/SpongeRegistrationHandler.java | 13 ++++---- .../sponge/argument/UserArgument.java | 30 ++++++++++--------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index d225fdad..08c2fc9e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -67,7 +67,6 @@ import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.data.persistence.DataContainer; @@ -134,7 +133,6 @@ public SpongeCommandManager( this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); this.setCaptionRegistry(new SpongeCaptionRegistry<>()); - Sponge.eventManager().registerListeners(this.pluginContainer, this.getCommandRegistrationHandler()); } private void registerParsers() { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 77848ef6..b54ab787 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -31,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; +import org.spongepowered.api.event.EventListenerRegistration; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; import java.util.HashSet; @@ -47,8 +48,7 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { } @SuppressWarnings("unchecked") - //@Listener - public void handleRegistrationEvent(final RegisterCommandEvent event) { + private void handleRegistrationEvent(final RegisterCommandEvent event) { this.commandManager.registrationCalled(); for (final CommandTree.Node> node : this.commandManager.getCommandTree().getRootNodes()) { final StaticArgument value = requireNonNull((StaticArgument) node.getValue()); @@ -68,12 +68,11 @@ private void registerCommand(final RegisterCommandEvent event, fina void initialize(final @NonNull SpongeCommandManager commandManager) { this.commandManager = commandManager; - // todo: https://github.com/SpongePowered/Sponge/issues/3367 Sponge.eventManager().registerListener( - this.commandManager.owningPluginContainer(), - new TypeToken>() { - }, - this::handleRegistrationEvent + EventListenerRegistration.builder(new TypeToken>() {}) + .plugin(this.commandManager.owningPluginContainer()) + .listener(this::handleRegistrationEvent) + .build() ); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index 17b3bc44..34ae6f08 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -47,6 +47,7 @@ import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.user.UserManager; import java.util.ArrayList; @@ -62,9 +63,11 @@ * Argument for parsing {@link User Users} in the {@link UserManager} from * a {@link Selector}, last known username, or {@link UUID}. * + * TODO: Update javadocs + * * @param sender type */ -public final class UserArgument extends CommandArgument { +public final class UserArgument extends CommandArgument { private UserArgument( final boolean required, @@ -78,7 +81,7 @@ private UserArgument( name, new Parser<>(), defaultValue, - User.class, + UUID.class, suggestionsProvider, defaultDescription ); @@ -123,13 +126,13 @@ private UserArgument( * * @param sender type */ - public static final class Parser implements NodeSupplyingArgumentParser { + public static final class Parser implements NodeSupplyingArgumentParser { private final ArgumentParser singlePlayerSelectorParser = new WrappedBrigadierParser<>(EntityArgument.player()); @Override - public @NonNull ArgumentParseResult<@NonNull User> parse( + public @NonNull ArgumentParseResult<@NonNull UUID> parse( @NonNull final CommandContext<@NonNull C> commandContext, @NonNull final Queue<@NonNull String> inputQueue ) { @@ -139,11 +142,11 @@ public static final class Parser implements NodeSupplyingArgumentParser optionalUser = Sponge.server().userManager().find(peek); + final Optional optionalUser = Sponge.server().gameProfileManager().cache().findByName(peek); // valid username if (optionalUser.isPresent()) { inputQueue.remove(); - return ArgumentParseResult.success(optionalUser.get()); + return ArgumentParseResult.success(optionalUser.get().uniqueId()); } return ArgumentParseResult.failure(new UserNotFoundException( commandContext, UserNotFoundException.Type.NAME, peek @@ -155,10 +158,8 @@ public static final class Parser implements NodeSupplyingArgumentParser optionalUser = Sponge.server().userManager().find(uuid); - if (optionalUser.isPresent()) { - inputQueue.remove(); - return ArgumentParseResult.success(optionalUser.get()); + if (Sponge.server().userManager().exists(uuid)) { + return ArgumentParseResult.success(uuid); } return ArgumentParseResult.failure(new UserNotFoundException( @@ -173,7 +174,7 @@ public static final class Parser implements NodeSupplyingArgumentParser handleSelector( + private @NonNull ArgumentParseResult<@NonNull UUID> handleSelector( final @NonNull CommandContext<@NonNull C> commandContext, final @NonNull Queue<@NonNull String> inputQueue ) { @@ -190,7 +191,7 @@ public static final class Parser implements NodeSupplyingArgumentParser implements NodeSupplyingArgumentParser suggestions = new ArrayList<>(this.singlePlayerSelectorParser.suggestions(commandContext, input)); if (!input.startsWith("@")) { suggestions.addAll(Sponge.server().userManager().streamOfMatches(input) + .filter(GameProfile::hasName) .map(profile -> profile.name().orElse(null)) .filter(Objects::nonNull) .filter(name -> !suggestions.contains(name)) @@ -221,10 +223,10 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type */ - public static final class Builder extends TypedBuilder> { + public static final class Builder extends TypedBuilder> { Builder(final @NonNull String name) { - super(User.class, name); + super(UUID.class, name); } @Override From 09f209351cf8aa989eca4d18a154632a5e2ba6e1 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 19 Sep 2021 12:10:07 -0700 Subject: [PATCH 32/72] Update for Sponge API and SpongeGradle changes --- .../sponge/CloudSpongeCommand.java | 9 ++++----- .../sponge/SpongeRegistrationHandler.java | 2 ++ .../sponge/argument/OperatorArgument.java | 2 +- .../sponge/argument/UserArgument.java | 6 ++---- examples/example-sponge/build.gradle.kts | 15 ++++++++++----- .../examples/sponge/CloudExamplePlugin.java | 16 +++++++--------- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 6d464d16..478ed71c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -39,7 +39,6 @@ import cloud.commandframework.types.tuples.Pair; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.util.ComponentMessageThrowable; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.Command; @@ -104,10 +103,10 @@ private void handleCommandException(final C cloudSender, final Audience audience cloudSender, InvalidSyntaxException.class, (InvalidSyntaxException) throwable, - (c, e) -> audience.sendMessage(TextComponent.ofChildren( + (c, e) -> audience.sendMessage(Component.text().append( text("Invalid Command Syntax. Correct command syntax is: ", RED), text("/" + e.getCorrectSyntax(), GRAY) - )) + ).build()) ); } else if (throwable instanceof InvalidCommandSenderException) { this.commandManager.handleException( @@ -135,10 +134,10 @@ private void handleCommandException(final C cloudSender, final Audience audience cloudSender, ArgumentParseException.class, (ArgumentParseException) throwable, - (c, e) -> audience.sendMessage(TextComponent.ofChildren( + (c, e) -> audience.sendMessage(Component.text().append( text("Invalid Command Argument: ", RED), getMessage(throwable.getCause()).colorIfAbsent(GRAY) - )) + ).build()) ); } else if (throwable instanceof CommandExecutionException) { this.commandManager.handleException( diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index b54ab787..1d1348b7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -32,6 +32,7 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; import org.spongepowered.api.event.EventListenerRegistration; +import org.spongepowered.api.event.Order; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; import java.util.HashSet; @@ -72,6 +73,7 @@ void initialize(final @NonNull SpongeCommandManager commandManager) { EventListenerRegistration.builder(new TypeToken>() {}) .plugin(this.commandManager.owningPluginContainer()) .listener(this::handleRegistrationEvent) + .order(Order.DEFAULT) .build() ); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index d9c2a1c2..14fc5c52 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -141,7 +141,7 @@ public static final class Parser implements NodeSupplyingArgumentParser sender type */ diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index e9f220c9..5e33442c 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -1,8 +1,8 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders -import org.spongepowered.plugin.metadata.PluginDependency +import org.spongepowered.plugin.metadata.model.PluginDependency plugins { - id("org.spongepowered.gradle.plugin") version "1.1.1" + id("org.spongepowered.gradle.plugin") version "2.0.0" id("com.github.johnrengelman.shadow") } @@ -12,11 +12,16 @@ dependencies { } sponge { - apiVersion("8.0.0") + apiVersion("8.0.0-SNAPSHOT") plugin("cloud-example-sponge") { - loader(PluginLoaders.JAVA_PLAIN) + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } displayName("Cloud example Sponge plugin") - mainClass("cloud.commandframework.examples.sponge.CloudExamplePlugin") + description("Plugin to demonstrate and test the Sponge implementation of cloud") + license("MIT") + entrypoint("cloud.commandframework.examples.sponge.CloudExamplePlugin") dependency("spongeapi") { loadOrder(PluginDependency.LoadOrder.AFTER) optional(false) diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 2555a08d..eeb1f352 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -61,7 +61,6 @@ import com.google.inject.TypeLiteral; import io.leangen.geantyref.TypeToken; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; @@ -94,7 +93,7 @@ import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.math.vector.Vector3d; import org.spongepowered.math.vector.Vector3i; -import org.spongepowered.plugin.jvm.Plugin; +import org.spongepowered.plugin.builtin.jvm.Plugin; import java.util.Optional; import java.util.function.Function; @@ -144,7 +143,7 @@ public CloudExamplePlugin(final @NonNull Injector injector) { // Register minecraft-extras exception handlers new MinecraftExceptionHandler() .withDefaultHandlers() - .withDecorator(message -> TextComponent.ofChildren(COMMAND_PREFIX, space(), message)) + .withDecorator(message -> Component.text().append(COMMAND_PREFIX, space(), message).build()) .apply(this.commandManager, CommandCause::audience); this.registerCommands(); @@ -272,10 +271,10 @@ private void registerCommands() { .argument(SinglePlayerSelectorArgument.of("player")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); - ctx.getSender().audience().sendMessage(TextComponent.ofChildren( + ctx.getSender().audience().sendMessage(Component.text().append( text("Display name of selected player: ", GRAY), player.displayName().get() - )); + ).build()); })); this.commandManager.command(cloud.literal("world_test") .argument(WorldArgument.of("world")) @@ -309,8 +308,7 @@ private void registerCommands() { final Function, RegistryHolder> holderFunction = ctx -> ctx.getSender() .location() .map(Location::world) - .orElse(Sponge.server().worldManager().defaultWorld()) - .registries(); + .orElse(Sponge.server().worldManager().defaultWorld()); this.commandManager.command(cloud.literal("test_biomes") .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) .handler(ctx -> { @@ -357,7 +355,7 @@ private void registerCommands() { .argument(MultipleEntitySelectorArgument.of("selector")) .handler(ctx -> { final MultipleEntitySelector selector = ctx.get("selector"); - ctx.getSender().audience().sendMessage(TextComponent.ofChildren( + ctx.getSender().audience().sendMessage(Component.text().append( text("Using selector: ", BLUE), text(selector.inputString()), newline(), @@ -365,7 +363,7 @@ private void registerCommands() { selector.get().stream() .map(e -> e.displayName().get()) .collect(Component.toComponent(text(", ", GRAY))) - )); + ).build()); })); this.commandManager.command(cloud.literal("user") From 0a48c4db80bc54fee8d2545ef7e4abcd75d5611b Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 10 Jan 2022 01:36:31 -0700 Subject: [PATCH 33/72] Update import order --- .../sponge/CloudInjectionModule.java | 5 ++--- .../sponge/CloudSpongeCommand.java | 13 ++++++------- .../sponge/SpongeCaptionKeys.java | 3 +-- .../sponge/SpongeCommandManager.java | 15 +++++++-------- .../sponge/SpongeParserMapper.java | 7 +++---- .../sponge/SpongeRegistrationHandler.java | 5 ++--- .../sponge/annotation/specifier/Center.java | 1 - .../sponge/argument/BlockInputArgument.java | 9 ++++----- .../sponge/argument/BlockPredicateArgument.java | 9 ++++----- .../sponge/argument/ComponentArgument.java | 7 +++---- .../sponge/argument/DataContainerArgument.java | 7 +++---- .../sponge/argument/GameProfileArgument.java | 9 ++++----- .../argument/GameProfileCollectionArgument.java | 13 ++++++------- .../argument/ItemStackPredicateArgument.java | 11 +++++------ .../MultipleEntitySelectorArgument.java | 11 +++++------ .../MultiplePlayerSelectorArgument.java | 11 +++++------ .../sponge/argument/NamedTextColorArgument.java | 13 ++++++------- .../sponge/argument/OperatorArgument.java | 13 ++++++------- .../sponge/argument/ProtoItemStackArgument.java | 9 ++++----- .../sponge/argument/RegistryEntryArgument.java | 15 +++++++-------- .../sponge/argument/ResourceKeyArgument.java | 7 +++---- .../sponge/argument/ResourceKeyUtil.java | 3 +-- .../argument/SingleEntitySelectorArgument.java | 7 +++---- .../argument/SinglePlayerSelectorArgument.java | 7 +++---- .../sponge/argument/UserArgument.java | 17 ++++++++--------- .../sponge/argument/Vector2dArgument.java | 7 +++---- .../sponge/argument/Vector2iArgument.java | 7 +++---- .../sponge/argument/Vector3dArgument.java | 7 +++---- .../sponge/argument/Vector3iArgument.java | 7 +++---- .../sponge/argument/VectorArgument.java | 5 ++--- .../sponge/argument/WorldArgument.java | 15 +++++++-------- .../sponge/data/BlockPredicate.java | 3 +-- .../sponge/data/GameProfileCollection.java | 3 +-- .../sponge/data/ItemStackPredicate.java | 3 +-- .../sponge/data/SelectorWrapper.java | 5 ++--- .../examples/sponge/CloudExamplePlugin.java | 5 ++--- 36 files changed, 129 insertions(+), 165 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index ab46a8e2..87e394fb 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -28,12 +28,11 @@ import com.google.inject.AbstractModule; import com.google.inject.Key; import com.google.inject.util.Types; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.command.CommandCause; - import java.lang.reflect.Type; import java.util.function.Function; import java.util.function.UnaryOperator; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.CommandCause; /** * Injection module that allows for {@link SpongeCommandManager} to be injectable. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 478ed71c..221c2550 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -37,6 +37,12 @@ import cloud.commandframework.permission.CommandPermission; import cloud.commandframework.permission.Permission; import cloud.commandframework.types.tuples.Pair; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletionException; +import java.util.stream.Collectors; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.util.ComponentMessageThrowable; @@ -48,13 +54,6 @@ import org.spongepowered.api.command.parameter.ArgumentReader; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import java.util.ArrayDeque; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletionException; -import java.util.stream.Collectors; - import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; import static net.kyori.adventure.text.format.NamedTextColor.RED; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index af48c5b7..92ab136e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -24,11 +24,10 @@ package cloud.commandframework.sponge; import cloud.commandframework.captions.Caption; -import org.checkerframework.checker.nullness.qual.NonNull; - import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import org.checkerframework.checker.nullness.qual.NonNull; /** * {@link Caption} instances for messages in cloud-sponge. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 08c2fc9e..06713426 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -64,6 +64,13 @@ import com.google.inject.Inject; import com.google.inject.Module; import io.leangen.geantyref.TypeToken; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; @@ -84,14 +91,6 @@ import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.PluginContainer; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; - /** * Command manager for Sponge API v8. *

      diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index f0aa95de..b3f05493 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -39,14 +39,13 @@ import cloud.commandframework.arguments.standard.UUIDArgument; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; - import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import static java.util.Objects.requireNonNull; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 1d1348b7..72dc9545 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -28,6 +28,8 @@ import cloud.commandframework.arguments.StaticArgument; import cloud.commandframework.internal.CommandRegistrationHandler; import io.leangen.geantyref.TypeToken; +import java.util.HashSet; +import java.util.Set; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; @@ -35,9 +37,6 @@ import org.spongepowered.api.event.Order; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; -import java.util.HashSet; -import java.util.Set; - import static java.util.Objects.requireNonNull; final class SpongeRegistrationHandler implements CommandRegistrationHandler { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java index 7e097f67..07aec9ea 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java @@ -25,7 +25,6 @@ import cloud.commandframework.sponge.argument.Vector2dArgument; import cloud.commandframework.sponge.argument.Vector3dArgument; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java index c71bf226..1399bb16 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java @@ -31,6 +31,10 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.data.BlockInput; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.arguments.blocks.BlockStateArgument; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; @@ -51,11 +55,6 @@ import org.spongepowered.common.util.VecHelper; import org.spongepowered.common.world.SpongeBlockChangeFlag; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * An argument for parsing {@link BlockInput} from a {@link BlockState} * and optional extra NBT data. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java index 8ff506ab..c5d5f630 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java @@ -33,6 +33,10 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.BlockPredicate; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Predicate; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.pattern.BlockInWorld; @@ -43,11 +47,6 @@ import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.common.util.VecHelper; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Predicate; - /** * An argument for parsing {@link BlockPredicate BlockPredicates}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java index 968937e4..f92c7f2b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -30,6 +30,9 @@ import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; @@ -39,10 +42,6 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.adventure.SpongeAdventure; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * An argument for parsing {@link Component Components} from json formatted text. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java index 1bbff9b4..ca27ba8b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java @@ -30,6 +30,9 @@ import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.arguments.CompoundTagArgument; import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; @@ -39,10 +42,6 @@ import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.common.data.persistence.NBTTranslator; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link DataContainer DataContainers} from * SNBT strings. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index 14acf48f..78551db6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -34,6 +34,10 @@ import cloud.commandframework.sponge.SpongeCaptionKeys; import cloud.commandframework.sponge.SpongeCommandContextKeys; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -43,11 +47,6 @@ import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing a single {@link GameProfile} from a {@link Selector}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index 9822b1eb..affb72ef 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -33,6 +33,12 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.GameProfileCollection; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -42,13 +48,6 @@ import org.spongepowered.api.profile.GameProfile; import org.spongepowered.common.profile.SpongeGameProfile; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - /** * Argument for parsing a {@link Collection} of {@link GameProfile GameProfiles} from a * {@link Selector}. A successfully parsed result will contain at least one element. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java index c9210c55..cd519bd5 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java @@ -34,6 +34,11 @@ import cloud.commandframework.sponge.data.ItemStackPredicate; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Predicate; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.item.ItemPredicateArgument; import org.checkerframework.checker.nullness.qual.NonNull; @@ -42,12 +47,6 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.item.inventory.ItemStack; -import java.util.Collections; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Predicate; - /** * An argument for parsing {@link ItemStackPredicate ItemStackPredicates}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 809fa479..3e6625dd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -33,6 +33,11 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultipleEntitySelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -43,12 +48,6 @@ import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.Entity; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - /** * Argument for selecting one or more {@link Entity Entities} using a {@link Selector}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index b581e4e8..d2c4f0ac 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -33,6 +33,11 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultiplePlayerSelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -44,12 +49,6 @@ import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.server.ServerPlayer; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - /** * Argument for selecting one or more {@link Player Players} using a {@link Selector}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index 9994e68a..c43f2d2f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -28,19 +28,18 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import net.kyori.adventure.text.format.NamedTextColor; -import net.minecraft.commands.arguments.ColorArgument; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; - import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minecraft.commands.arguments.ColorArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; /** * An argument for parsing {@link NamedTextColor NamedTextColors}. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index 14fc5c52..d27e95ad 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -29,6 +29,12 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; import net.minecraft.commands.arguments.OperationArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -38,13 +44,6 @@ import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.RegistryTypes; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - /** * An argument for parsing {@link Operator Operators}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java index 922058e8..3a9526ca 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java @@ -33,6 +33,10 @@ import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.kyori.adventure.util.ComponentMessageThrowable; import net.minecraft.commands.arguments.item.ItemArgument; import net.minecraft.commands.arguments.item.ItemInput; @@ -48,11 +52,6 @@ import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.common.data.persistence.NBTTranslator; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * An argument for parsing {@link ProtoItemStack ProtoItemStacks} from an {@link ItemType} identifier * and optional NBT data. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index d62cc1e0..11c26674 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -32,6 +32,13 @@ import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCaptionKeys; import io.leangen.geantyref.TypeToken; +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; @@ -46,14 +53,6 @@ import org.spongepowered.api.registry.RegistryType; import org.spongepowered.api.registry.RegistryTypes; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * An argument for retrieving values from any of Sponge's {@link Registry Registries}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java index 2c3d63d2..8466b163 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -28,16 +28,15 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link ResourceKey ResourceKeys}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java index cd45fa9d..c76decdf 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java @@ -25,13 +25,12 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import java.lang.reflect.Field; import net.minecraft.resources.ResourceLocation; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; -import java.lang.reflect.Field; - /** * Shared utilities for ResourceKey based arguments. Not API. */ diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index 2e898d57..6f296a52 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -33,6 +33,9 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SingleEntitySelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -43,10 +46,6 @@ import org.spongepowered.api.command.selector.Selector; import org.spongepowered.api.entity.Entity; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for selecting a single {@link Entity} using a {@link Selector}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index fb00d869..491cd721 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -33,6 +33,9 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -44,10 +47,6 @@ import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.server.ServerPlayer; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for selecting a single {@link Player} using a {@link Selector}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index a1323497..4fc976d1 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -36,6 +36,14 @@ import cloud.commandframework.sponge.SpongeCaptionKeys; import cloud.commandframework.sponge.SpongeCommandContextKeys; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.UUID; +import java.util.function.BiFunction; +import java.util.stream.Collectors; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -50,15 +58,6 @@ import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.user.UserManager; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Queue; -import java.util.UUID; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - /** * Argument for parsing {@link User} {@link UUID UUIDs} in the {@link UserManager} from * a {@link Selector}, last known username, or {@link UUID} string. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java index 3bf5f6c3..e62063af 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -31,6 +31,9 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.commands.arguments.coordinates.Vec2Argument; @@ -41,10 +44,6 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2d; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link Vector2d} from relative, absolute, or local coordinates. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index e9442dc2..1388e052 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -31,6 +31,9 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.ColumnPosArgument; import net.minecraft.commands.arguments.coordinates.Coordinates; @@ -41,10 +44,6 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2i; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link Vector2i} from relative, absolute, or local coordinates. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index 8d3677ec..a5022e9c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -31,6 +31,9 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.commands.arguments.coordinates.Vec3Argument; @@ -41,10 +44,6 @@ import org.spongepowered.common.util.VecHelper; import org.spongepowered.math.vector.Vector3d; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link Vector3d} from relative, absolute, or local coordinates. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index 91c254fd..0d4e1b01 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -31,6 +31,9 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.commands.arguments.coordinates.Coordinates; @@ -41,10 +44,6 @@ import org.spongepowered.common.util.VecHelper; import org.spongepowered.math.vector.Vector3i; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; - /** * Argument for parsing {@link Vector3i} from relative, absolute, or local coordinates. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java index a929c65b..fb409429 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java @@ -27,11 +27,10 @@ import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - import java.util.List; import java.util.function.BiFunction; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; /** * Parent of {@link Vector3dArgument} and {@link Vector2dArgument} containing shared methods. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 356205ea..8f1d0a9a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -29,6 +29,13 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.stream.Collectors; +import java.util.stream.Stream; import net.minecraft.commands.arguments.DimensionArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -39,14 +46,6 @@ import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.api.world.server.WorldManager; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * Argument for retrieving {@link ServerWorld ServerWorlds} from the {@link WorldManager} by their {@link ResourceKey}. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java index 5ba85654..e35fd874 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java @@ -23,12 +23,11 @@ // package cloud.commandframework.sponge.data; +import java.util.function.Predicate; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.server.ServerWorld; -import java.util.function.Predicate; - /** * A {@link Predicate} for blocks in a {@link ServerWorld}, parsed from user input. * diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java index 2afc1e5f..d6bb9513 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java @@ -23,11 +23,10 @@ // package cloud.commandframework.sponge.data; +import java.util.Collection; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.profile.GameProfile; -import java.util.Collection; - /** * Cloud wrapper for a {@link Collection} of {@link GameProfile GameProfiles}. */ diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java index bd74bb83..8891de2c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java @@ -23,9 +23,8 @@ // package cloud.commandframework.sponge.data; -import org.spongepowered.api.item.inventory.ItemStack; - import java.util.function.Predicate; +import org.spongepowered.api.item.inventory.ItemStack; /** * A {@link Predicate} for {@link ItemStack ItemStacks}, parsed from user input. diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java index ac0c9dba..6d4aec4a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java @@ -23,11 +23,10 @@ // package cloud.commandframework.sponge.data; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.command.selector.Selector; - import java.util.Collection; import java.util.Collections; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.selector.Selector; /** * Cloud wrapper for parsed {@link org.spongepowered.api.command.selector.Selector Selectors} and their results. diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index eeb1f352..47b84b8f 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -60,6 +60,8 @@ import com.google.inject.Key; import com.google.inject.TypeLiteral; import io.leangen.geantyref.TypeToken; +import java.util.Optional; +import java.util.function.Function; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; @@ -95,9 +97,6 @@ import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.builtin.jvm.Plugin; -import java.util.Optional; -import java.util.function.Function; - import static net.kyori.adventure.text.Component.newline; import static net.kyori.adventure.text.Component.space; import static net.kyori.adventure.text.Component.text; From 247dda481dc94a0afed9b6f787b5b6a7053a88cb Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 10 Jan 2022 01:49:28 -0700 Subject: [PATCH 34/72] sponge: Catch late command manager creation --- .../sponge/SpongeCommandManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 06713426..eabfa1ed 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -74,6 +74,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.data.persistence.DataContainer; @@ -124,6 +125,7 @@ public SpongeCommandManager( final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper ) { super(commandExecutionCoordinator, new SpongeRegistrationHandler()); + this.checkLateCreation(); this.pluginContainer = pluginContainer; ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this); this.causeMapper = causeMapper; @@ -134,6 +136,16 @@ public SpongeCommandManager( this.setCaptionRegistry(new SpongeCaptionRegistry<>()); } + private void checkLateCreation() { + // Not the most accurate check, but will at least catch creation attempted after the server has started + if (!Sponge.isServerAvailable()) { + return; + } + throw new IllegalStateException( + "SpongeCommandManager must be created before the first firing of RegisterCommandEvent. (created too late)" + ); + } + private void registerParsers() { this.getParserRegistry().registerParserSupplier( TypeToken.get(ComponentArgument.class), From 86163463dfcc9a06ff59c21116ee10d1421dce02 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 11 Jan 2022 18:50:02 -0700 Subject: [PATCH 35/72] sponge: Use usage message for description --- .../sponge/CloudSpongeCommand.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 221c2550..c12984cd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -174,46 +174,45 @@ public List complete( @Override public boolean canExecute(final @NonNull CommandCause cause) { - final CommandTree.Node> rootNode = this.commandManager.getCommandTree().getNamedNode(this.label); return this.commandManager.hasPermission( this.commandManager.backwardsCauseMapper().apply(cause), - (CommandPermission) rootNode.getNodeMeta().getOrDefault("permission", Permission.empty()) + (CommandPermission) this.namedNode().getNodeMeta().getOrDefault("permission", Permission.empty()) ); } @Override public Optional shortDescription(final CommandCause cause) { - // todo - return Optional.of(text("short desc!")); + return Optional.of(this.usage()); } @Override public Optional extendedDescription(final CommandCause cause) { - // todo - return Optional.of(text("long desc!")); + return Optional.of(this.usage()); } @Override public Optional help(final @NonNull CommandCause cause) { - // todo - return Raw.super.help(cause); + return Optional.of(this.usage()); } @Override public Component usage(final CommandCause cause) { - return text(this.commandManager.getCommandSyntaxFormatter().apply( - Collections.emptyList(), - this.commandManager.getCommandTree().getNamedNode(this.label) - )); + return this.usage(); + } + + private Component usage() { + return text(this.commandManager.getCommandSyntaxFormatter().apply(Collections.emptyList(), this.namedNode())); + } + + private CommandTree.Node> namedNode() { + return this.commandManager.getCommandTree().getNamedNode(this.label); } @Override public CommandTreeNode.Root commandTree() { final CommandTreeNode root = CommandTreeNode.root(); - final CommandTree.Node> cloud = this.commandManager - .getCommandTree() - .getNamedNode(this.label); + final CommandTree.Node> cloud = this.namedNode(); if (cloud.isLeaf() || cloud.getValue().getOwningCommand() != null) { root.executable(); From 54b3013bd2765d601983fa9e3cc500f32f70100b Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 11 Jan 2022 19:00:33 -0700 Subject: [PATCH 36/72] sponge: Improve WorldArgument suggestions --- .../cloud/commandframework/sponge/argument/WorldArgument.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 8f1d0a9a..d1d9ac1b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -161,7 +161,7 @@ public static final class Parser implements NodeSupplyingArgumentParser { - if (world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + if (!input.isEmpty() && world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { return Stream.of(world.key().value(), world.key().asString()); } return Stream.of(world.key().asString()); From 6790b4dbff796515408004ecf14b125e1a548e96 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:50:21 -0700 Subject: [PATCH 37/72] Fixes for SpongeForge --- .../sponge/argument/OperatorArgument.java | 14 +++++++------- .../sponge/argument/ResourceKeyUtil.java | 10 +++++++--- .../sponge/argument/WorldArgument.java | 11 +++++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index d27e95ad..bb3f04cf 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -29,13 +29,12 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.List; import java.util.Optional; import java.util.Queue; import java.util.function.BiFunction; import java.util.stream.Collectors; -import net.minecraft.commands.arguments.OperationArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.parameter.managed.operator.Operator; @@ -140,11 +139,12 @@ public static final class Parser implements NodeSupplyingArgumentParser spongeAccessor = + Class.forName("org.spongepowered.common.accessor.commands.arguments.OperationArgumentAccessor"); + final Method get = spongeAccessor.getDeclaredMethod("accessor$ERROR_INVALID_OPERATION"); + get.setAccessible(true); + ERROR_INVALID_OPERATION = (SimpleCommandExceptionType) get.invoke(null); } catch (final ReflectiveOperationException ex) { throw new RuntimeException("Couldn't access ERROR_INVALID_OPERATION command exception type.", ex); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java index c76decdf..8452db7f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java @@ -26,6 +26,7 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.lang.reflect.Field; +import java.util.Arrays; import net.minecraft.resources.ResourceLocation; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -43,11 +44,14 @@ private ResourceKeyUtil() { static { try { - // todo: use an accessor - final Field errorInvalidResourceLocationField = ResourceLocation.class.getDeclaredField("ERROR_INVALID"); + // ERROR_INVALID (todo: use accessor) + final Field errorInvalidResourceLocationField = Arrays.stream(ResourceLocation.class.getDeclaredFields()) + .filter(it -> it.getType().equals(SimpleCommandExceptionType.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); errorInvalidResourceLocationField.setAccessible(true); ERROR_INVALID_RESOURCE_LOCATION = (SimpleCommandExceptionType) errorInvalidResourceLocationField.get(null); - } catch (final ReflectiveOperationException ex) { + } catch (final Exception ex) { throw new RuntimeException("Couldn't access ERROR_INVALID command exception type.", ex); } } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index d1d9ac1b..915724c0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -30,6 +30,7 @@ import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Queue; @@ -127,12 +128,14 @@ public static final class Parser implements NodeSupplyingArgumentParser f.getType().equals(DynamicCommandExceptionType.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); errorInvalidValueField.setAccessible(true); ERROR_INVALID_VALUE = (DynamicCommandExceptionType) errorInvalidValueField.get(null); - } catch (final ReflectiveOperationException ex) { + } catch (final Exception ex) { throw new RuntimeException("Couldn't access ERROR_INVALID_VALUE command exception type.", ex); } } From 8cc76c6e713da2d7f073cc1c15c113020bab8037 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 13 Jan 2022 16:00:23 -0700 Subject: [PATCH 38/72] sponge: Update RegistryEntryArgument --- .../sponge/argument/RegistryEntryArgument.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index 11c26674..c7c222ec 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -59,7 +59,7 @@ * @param sender type * @param value type */ -public final class RegistryEntryArgument extends CommandArgument { // todo: should we return a RegistryEntry? +public final class RegistryEntryArgument extends CommandArgument { private RegistryEntryArgument( final boolean required, @@ -500,7 +500,7 @@ private Registry registry(final @NonNull CommandContext commandContext) { final @NonNull String input ) { return this.registry(commandContext).streamEntries().flatMap(entry -> { - if (entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + if (!input.isEmpty() && entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { return Stream.of(entry.key().value(), entry.key().asString()); } return Stream.of(entry.key().asString()); @@ -523,8 +523,8 @@ private Registry registry(final @NonNull CommandContext commandContext) { } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { - // todo: should we use custom suggestions? sponge seems to include non-vanilla dimension types in it's registry. - return CommandTreeNodeTypes.DIMENSION.get().createNode(); + return CommandTreeNodeTypes.DIMENSION.get().createNode() + .customCompletions(); // Sponge adds custom types (?) } return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); } From 644ad39d8e60b6be31d7d45ac51031d1bcb26ca7 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 13 Jan 2022 21:10:25 -0700 Subject: [PATCH 39/72] sponge: Make GameProfileCollection extend Collection --- .../GameProfileCollectionArgument.java | 85 +++++++++++++++++-- .../sponge/data/GameProfileCollection.java | 16 +--- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index affb72ef..1b2cf286 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -35,6 +35,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; @@ -42,6 +43,7 @@ import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.DefaultQualifier; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; @@ -129,12 +131,7 @@ public static final class Parser implements NodeSupplyingArgumentParser result = profiles.stream() .map(SpongeGameProfile::of).collect(Collectors.toList()); - return ArgumentParseResult.success(new GameProfileCollection() { - @Override - public @NonNull Collection<@NonNull GameProfile> gameProfiles() { - return Collections.unmodifiableCollection(result); - } - }); + return ArgumentParseResult.success(new GameProfileCollectionImpl(Collections.unmodifiableCollection(result))); }); @Override @@ -184,4 +181,80 @@ public static final class Builder extends TypedBuilder backing; + + private GameProfileCollectionImpl(final Collection backing) { + this.backing = backing; + } + + @Override + public int size() { + return this.backing.size(); + } + + @Override + public boolean isEmpty() { + return this.backing.isEmpty(); + } + + @Override + public boolean contains(final Object o) { + return this.backing.contains(o); + } + + @Override + public Iterator iterator() { + return this.backing.iterator(); + } + + @Override + public Object[] toArray() { + return this.backing.toArray(); + } + + @Override + public T[] toArray(final T[] a) { + return this.backing.toArray(a); + } + + @Override + public boolean add(final GameProfile gameProfile) { + return this.backing.add(gameProfile); + } + + @Override + public boolean remove(final Object o) { + return this.backing.remove(o); + } + + @Override + public boolean containsAll(final Collection c) { + return this.backing.containsAll(c); + } + + @Override + public boolean addAll(final Collection c) { + return this.backing.addAll(c); + } + + @Override + public boolean removeAll(final Collection c) { + return this.backing.removeAll(c); + } + + @Override + public boolean retainAll(final Collection c) { + return this.backing.retainAll(c); + } + + @Override + public void clear() { + this.backing.clear(); + } + + } + } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java index d6bb9513..a69fb2e2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java @@ -24,21 +24,13 @@ package cloud.commandframework.sponge.data; import java.util.Collection; -import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.profile.GameProfile; /** - * Cloud wrapper for a {@link Collection} of {@link GameProfile GameProfiles}. + * Cloud result type for a {@link Collection} of {@link GameProfile GameProfiles}. + * + *

      A successfully parsed result will always contain at least {@code 1} element.

      */ -public interface GameProfileCollection { - - /** - * Get the wrapped {@link Collection} of {@link GameProfile GameProfiles}. - * - *

      A successfully parsed result will always contain at least {@code 1} element.

      - * - * @return a {@link Collection} of {@link GameProfile GameProfiles} - */ - @NonNull Collection<@NonNull GameProfile> gameProfiles(); +public interface GameProfileCollection extends Collection { } From a425476821cc811eb7561c0d068b1f12710e325a Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 13 Jan 2022 21:16:06 -0700 Subject: [PATCH 40/72] more spongeforge fixes --- .../sponge/argument/BlockInputArgument.java | 15 ++++++++------- .../sponge/argument/ProtoItemStackArgument.java | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java index 1399bb16..9bcd53f6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java @@ -32,6 +32,7 @@ import cloud.commandframework.sponge.NodeSupplyingArgumentParser; import cloud.commandframework.sponge.data.BlockInput; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; @@ -200,15 +201,15 @@ public static final class Parser implements NodeSupplyingArgumentParser f.getType().equals(CompoundTag.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); static { - try { - COMPOUND_TAG_FIELD = net.minecraft.commands.arguments.blocks.BlockInput.class.getDeclaredField("tag"); - COMPOUND_TAG_FIELD.setAccessible(true); - } catch (final ReflectiveOperationException ex) { - throw new RuntimeException(ex); - } + COMPOUND_TAG_FIELD.setAccessible(true); } private final net.minecraft.commands.arguments.blocks.BlockInput blockInput; diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java index 3a9526ca..8963bfb3 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java @@ -34,6 +34,7 @@ import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; @@ -213,15 +214,15 @@ public static final class Parser implements NodeSupplyingArgumentParser f.getType().equals(CompoundTag.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); static { - try { - COMPOUND_TAG_FIELD = ItemInput.class.getDeclaredField("tag"); - COMPOUND_TAG_FIELD.setAccessible(true); - } catch (final ReflectiveOperationException ex) { - throw new RuntimeException(ex); - } + COMPOUND_TAG_FIELD.setAccessible(true); } private final ItemInput itemInput; From 24b7b2fde9b990aa6c5a2a94207140b2dac950f8 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 17 Jan 2022 00:58:45 -0700 Subject: [PATCH 41/72] address review comments --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 +- .../sponge/CloudSpongeCommand.java | 6 +-- .../GameProfileCollectionArgument.java | 54 ++----------------- examples/example-sponge/build.gradle.kts | 2 +- 4 files changed, 8 insertions(+), 56 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index 6b84f6d9..ca8201a1 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -7,7 +7,7 @@ plugins { dependencies { api(project(":cloud-core")) implementation(project(":cloud-brigadier")) - compileOnly("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") + compileOnly("org.spongepowered:spongeapi:8.0.0") compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index c12984cd..a2166d73 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -60,7 +60,7 @@ final class CloudSpongeCommand implements Command.Raw { - private static final Component NULL = Component.text("null"); + private static final Component NULL = text("null"); private static final Component MESSAGE_INTERNAL_ERROR = text("An internal error occurred while attempting to perform this command.", RED); private static final Component MESSAGE_NO_PERMS = @@ -102,7 +102,7 @@ private void handleCommandException(final C cloudSender, final Audience audience cloudSender, InvalidSyntaxException.class, (InvalidSyntaxException) throwable, - (c, e) -> audience.sendMessage(Component.text().append( + (c, e) -> audience.sendMessage(text().append( text("Invalid Command Syntax. Correct command syntax is: ", RED), text("/" + e.getCorrectSyntax(), GRAY) ).build()) @@ -133,7 +133,7 @@ private void handleCommandException(final C cloudSender, final Audience audience cloudSender, ArgumentParseException.class, (ArgumentParseException) throwable, - (c, e) -> audience.sendMessage(Component.text().append( + (c, e) -> audience.sendMessage(text().append( text("Invalid Command Argument: ", RED), getMessage(throwable.getCause()).colorIfAbsent(GRAY) ).build()) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index 1b2cf286..ed5a55ec 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -33,6 +33,7 @@ import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.GameProfileCollection; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.AbstractCollection; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -182,7 +183,8 @@ public static final class Builder extends TypedBuilder + implements GameProfileCollection { private final Collection backing; @@ -195,66 +197,16 @@ public int size() { return this.backing.size(); } - @Override - public boolean isEmpty() { - return this.backing.isEmpty(); - } - - @Override - public boolean contains(final Object o) { - return this.backing.contains(o); - } - @Override public Iterator iterator() { return this.backing.iterator(); } - @Override - public Object[] toArray() { - return this.backing.toArray(); - } - - @Override - public T[] toArray(final T[] a) { - return this.backing.toArray(a); - } - @Override public boolean add(final GameProfile gameProfile) { return this.backing.add(gameProfile); } - @Override - public boolean remove(final Object o) { - return this.backing.remove(o); - } - - @Override - public boolean containsAll(final Collection c) { - return this.backing.containsAll(c); - } - - @Override - public boolean addAll(final Collection c) { - return this.backing.addAll(c); - } - - @Override - public boolean removeAll(final Collection c) { - return this.backing.removeAll(c); - } - - @Override - public boolean retainAll(final Collection c) { - return this.backing.retainAll(c); - } - - @Override - public void clear() { - this.backing.clear(); - } - } } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 5e33442c..08511abc 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { } sponge { - apiVersion("8.0.0-SNAPSHOT") + apiVersion("8.0.0") plugin("cloud-example-sponge") { loader { name(PluginLoaders.JAVA_PLAIN) From b7d75de10ff8e66c1eb4b6b4f26eefedd0ca601e Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 10 Mar 2022 15:33:19 -0700 Subject: [PATCH 42/72] build updates --- cloud-minecraft/cloud-sponge/build.gradle.kts | 1 + examples/example-sponge/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index ca8201a1..a4131cfc 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -1,6 +1,7 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { + id("cloud.base-conventions") id("org.spongepowered.gradle.vanilla") version "0.2" } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 08511abc..9cf11308 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders import org.spongepowered.plugin.metadata.model.PluginDependency plugins { - id("org.spongepowered.gradle.plugin") version "2.0.0" + id("org.spongepowered.gradle.plugin") version "2.0.1" id("com.github.johnrengelman.shadow") } From 9f0dcc5fd2bb4af96417684ebe331d002cb88f9a Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 19 Jun 2022 11:17:33 -0700 Subject: [PATCH 43/72] Update for 1.7.0 deprecations --- .../sponge/CloudSpongeCommand.java | 4 +- .../sponge/SpongeCommandManager.java | 54 +++++++++---------- .../sponge/SpongeRegistrationHandler.java | 2 +- .../ComponentMessageRuntimeException.java | 1 + 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index a2166d73..6ebb569b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -201,11 +201,11 @@ public Component usage(final CommandCause cause) { } private Component usage() { - return text(this.commandManager.getCommandSyntaxFormatter().apply(Collections.emptyList(), this.namedNode())); + return text(this.commandManager.commandSyntaxFormatter().apply(Collections.emptyList(), this.namedNode())); } private CommandTree.Node> namedNode() { - return this.commandManager.getCommandTree().getNamedNode(this.label); + return this.commandManager.commandTree().getNamedNode(this.label); } @Override diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index eabfa1ed..bf977eb8 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -127,13 +127,13 @@ public SpongeCommandManager( super(commandExecutionCoordinator, new SpongeRegistrationHandler()); this.checkLateCreation(); this.pluginContainer = pluginContainer; - ((SpongeRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this); + ((SpongeRegistrationHandler) this.commandRegistrationHandler()).initialize(this); this.causeMapper = causeMapper; this.backwardsCauseMapper = backwardsCauseMapper; this.parserMapper = new SpongeParserMapper<>(); this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); - this.setCaptionRegistry(new SpongeCaptionRegistry<>()); + this.captionRegistry(new SpongeCaptionRegistry<>()); } private void checkLateCreation() { @@ -147,95 +147,95 @@ private void checkLateCreation() { } private void registerParsers() { - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(ComponentArgument.class), params -> new ComponentArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(NamedTextColor.class), params -> new NamedTextColorArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(Operator.class), params -> new OperatorArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(ServerWorld.class), params -> new WorldArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(ProtoItemStack.class), params -> new ProtoItemStackArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(ItemStackPredicate.class), params -> new ItemStackPredicateArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(ResourceKey.class), params -> new ResourceKeyArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(GameProfile.class), params -> new GameProfileArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(GameProfileCollection.class), params -> new GameProfileCollectionArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(BlockInputArgument.class), params -> new BlockInputArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(BlockPredicate.class), params -> new BlockPredicateArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(User.class), params -> new UserArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(DataContainer.class), params -> new DataContainerArgument.Parser<>() ); // Position arguments - this.getParserRegistry().registerAnnotationMapper( + this.parserRegistry().registerAnnotationMapper( Center.class, (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(Vector2d.class), params -> new Vector2dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(Vector3d.class), params -> new Vector3dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(Vector2i.class), params -> new Vector2iArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(Vector3i.class), params -> new Vector3iArgument.Parser<>() ); // Entity selectors - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(SinglePlayerSelector.class), params -> new SinglePlayerSelectorArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(MultiplePlayerSelector.class), params -> new MultiplePlayerSelectorArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(SingleEntitySelector.class), params -> new SingleEntitySelectorArgument.Parser<>() ); - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(MultipleEntitySelector.class), params -> new MultipleEntitySelectorArgument.Parser<>() ); @@ -265,7 +265,7 @@ private void registerRegistryParsers() { final DefaultedRegistryType defaultedRegistryType = (DefaultedRegistryType) registryType; final Type valueType = ((ParameterizedType) generic).getActualTypeArguments()[0]; - this.getParserRegistry().registerParserSupplier( + this.parserRegistry().registerParserSupplier( TypeToken.get(valueType), params -> new RegistryEntryArgument.Parser<>(defaultedRegistryType) ); @@ -331,7 +331,7 @@ void registrationCalled() { this.registrationCallbackListeners.forEach(listener -> listener.accept(this)); this.registrationCallbackListeners.clear(); } - if (this.getRegistrationState() != RegistrationState.AFTER_REGISTRATION) { + if (this.registrationState() != RegistrationState.AFTER_REGISTRATION) { this.lockRegistration(); } } @@ -351,7 +351,7 @@ void registrationCalled() { * @param listener listener */ public void addRegistrationCallbackListener(final @NonNull Consumer<@NonNull SpongeCommandManager> listener) { - if (this.getRegistrationState() == RegistrationState.AFTER_REGISTRATION) { + if (this.registrationState() == RegistrationState.AFTER_REGISTRATION) { throw new IllegalStateException("The SpongeCommandManager is in the AFTER_REGISTRATION state!"); } this.registrationCallbackListeners.add(listener); diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 72dc9545..e2c4ab6d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -50,7 +50,7 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { @SuppressWarnings("unchecked") private void handleRegistrationEvent(final RegisterCommandEvent event) { this.commandManager.registrationCalled(); - for (final CommandTree.Node> node : this.commandManager.getCommandTree().getRootNodes()) { + for (final CommandTree.Node> node : this.commandManager.commandTree().getRootNodes()) { final StaticArgument value = requireNonNull((StaticArgument) node.getValue()); this.registerCommand(event, value); } diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java index 324ffcd8..bb4dedc4 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java @@ -34,6 +34,7 @@ * {@link Component} rather than a String. This allows formatted and localized * exception messages. */ +@SuppressWarnings("serial") public class ComponentMessageRuntimeException extends RuntimeException implements ComponentMessageThrowable { private static final long serialVersionUID = 2152146048432114275L; From a2b9da90332c86150826cb70517638421143e0dc Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 19 Jun 2022 11:17:39 -0700 Subject: [PATCH 44/72] Update sponge --- cloud-minecraft/cloud-sponge/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index a4131cfc..b6585a71 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -8,8 +8,8 @@ plugins { dependencies { api(project(":cloud-core")) implementation(project(":cloud-brigadier")) - compileOnly("org.spongepowered:spongeapi:8.0.0") - compileOnly("org.spongepowered:sponge:1.16.5-8.0.0-SNAPSHOT") + compileOnly("org.spongepowered:spongeapi:8.1.0") + compileOnly("org.spongepowered:sponge:1.16.5-8.1.0-SNAPSHOT") } minecraft { From 384944a6597c5877a383cbacc44abc3b55abe43b Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 6 Nov 2022 09:49:43 -0700 Subject: [PATCH 45/72] update sponge module --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 +- .../java/cloud/commandframework/sponge/SpongeParserMapper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index b6585a71..64f9c032 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { id("cloud.base-conventions") - id("org.spongepowered.gradle.vanilla") version "0.2" + id("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" } dependencies { diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index b3f05493..ff421a45 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -114,7 +114,7 @@ private void initStandardMappers() { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word(); } else if (mode == StringArgument.StringMode.QUOTED) { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions(); - } else if (mode == StringArgument.StringMode.GREEDY) { + } else if (mode == StringArgument.StringMode.GREEDY || mode == StringArgument.StringMode.GREEDY_FLAG_YIELDING) { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); } throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); From 4e9295124b9ace281770f3d713a7d10817156df1 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 1 Dec 2022 20:32:28 -0700 Subject: [PATCH 46/72] Update headers --- .../cloud/commandframework/sponge/CloudInjectionModule.java | 2 +- .../java/cloud/commandframework/sponge/CloudSpongeCommand.java | 2 +- .../commandframework/sponge/NodeSupplyingArgumentParser.java | 2 +- .../java/cloud/commandframework/sponge/SpongeCaptionKeys.java | 2 +- .../cloud/commandframework/sponge/SpongeCaptionRegistry.java | 2 +- .../cloud/commandframework/sponge/SpongeCommandContextKeys.java | 2 +- .../cloud/commandframework/sponge/SpongeCommandManager.java | 2 +- .../commandframework/sponge/SpongeCommandPreprocessor.java | 2 +- .../java/cloud/commandframework/sponge/SpongeParserMapper.java | 2 +- .../cloud/commandframework/sponge/SpongeParserParameters.java | 2 +- .../commandframework/sponge/SpongeRegistrationHandler.java | 2 +- .../commandframework/sponge/annotation/specifier/Center.java | 2 +- .../commandframework/sponge/argument/BlockInputArgument.java | 2 +- .../sponge/argument/BlockPredicateArgument.java | 2 +- .../commandframework/sponge/argument/ComponentArgument.java | 2 +- .../commandframework/sponge/argument/DataContainerArgument.java | 2 +- .../commandframework/sponge/argument/GameProfileArgument.java | 2 +- .../sponge/argument/GameProfileCollectionArgument.java | 2 +- .../sponge/argument/ItemStackPredicateArgument.java | 2 +- .../sponge/argument/MultipleEntitySelectorArgument.java | 2 +- .../sponge/argument/MultiplePlayerSelectorArgument.java | 2 +- .../sponge/argument/NamedTextColorArgument.java | 2 +- .../commandframework/sponge/argument/OperatorArgument.java | 2 +- .../sponge/argument/ProtoItemStackArgument.java | 2 +- .../commandframework/sponge/argument/RegistryEntryArgument.java | 2 +- .../commandframework/sponge/argument/ResourceKeyArgument.java | 2 +- .../cloud/commandframework/sponge/argument/ResourceKeyUtil.java | 2 +- .../sponge/argument/SingleEntitySelectorArgument.java | 2 +- .../sponge/argument/SinglePlayerSelectorArgument.java | 2 +- .../cloud/commandframework/sponge/argument/UserArgument.java | 2 +- .../commandframework/sponge/argument/Vector2dArgument.java | 2 +- .../commandframework/sponge/argument/Vector2iArgument.java | 2 +- .../commandframework/sponge/argument/Vector3dArgument.java | 2 +- .../commandframework/sponge/argument/Vector3iArgument.java | 2 +- .../cloud/commandframework/sponge/argument/VectorArgument.java | 2 +- .../cloud/commandframework/sponge/argument/WorldArgument.java | 2 +- .../java/cloud/commandframework/sponge/data/BlockInput.java | 2 +- .../java/cloud/commandframework/sponge/data/BlockPredicate.java | 2 +- .../commandframework/sponge/data/GameProfileCollection.java | 2 +- .../cloud/commandframework/sponge/data/ItemStackPredicate.java | 2 +- .../commandframework/sponge/data/MultipleEntitySelector.java | 2 +- .../commandframework/sponge/data/MultiplePlayerSelector.java | 2 +- .../java/cloud/commandframework/sponge/data/ProtoItemStack.java | 2 +- .../cloud/commandframework/sponge/data/SelectorWrapper.java | 2 +- .../commandframework/sponge/data/SingleEntitySelector.java | 2 +- .../commandframework/sponge/data/SinglePlayerSelector.java | 2 +- .../sponge/exception/ComponentMessageRuntimeException.java | 2 +- 47 files changed, 47 insertions(+), 47 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index 87e394fb..733d431e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 6ebb569b..5df0ef86 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java index c5f554a3..b4059958 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index 92ab136e..68fb7d6c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index 679ced80..d6396215 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index 3f44de0b..a44d1cb8 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index bf977eb8..4275bc2a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index b84e5a64..f5c7190f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index ff421a45..f12fb0e3 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java index 4678d9c8..075f33ab 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index e2c4ab6d..4c7a2401 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java index 07aec9ea..01338df3 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java index 9bcd53f6..d177fb73 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java index c5d5f630..597fe023 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java index f92c7f2b..e7f75371 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java index ca27ba8b..fcee3574 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java index 78551db6..97a8f613 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java index ed5a55ec..f841e9ec 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java index cd519bd5..0e108094 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java index 3e6625dd..5e745ea2 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java index d2c4f0ac..aefd158f 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java index c43f2d2f..9d11581d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java index bb3f04cf..c50a6f50 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java index 8963bfb3..2f7f1449 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java index c7c222ec..2161c90a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java index 8466b163..d770ca6d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java index 8452db7f..c351ddac 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java index 6f296a52..883e706a 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java index 491cd721..e4287cf6 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java index 4fc976d1..c449564c 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java index e62063af..f091e894 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java index 1388e052..88af3b56 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java index a5022e9c..cea124dd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java index 0d4e1b01..7d9dce3e 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java index fb409429..16c40c26 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java index 915724c0..a9ab5965 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java index ef7c39c2..f82931df 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java index e35fd874..410ff6b3 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java index a69fb2e2..7feb28b0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java index 8891de2c..d86661ea 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java index 729a84b7..6f945dc9 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java index 5b6255e2..9d83b1cd 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java index aa28b122..667669d7 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java index 6d4aec4a..a9702da0 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java index 124d8d4c..a41edced 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java index 9039d70e..74fd192b 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java index bb4dedc4..18e9892d 100644 --- a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java +++ b/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From 4a9d907f11833fab005cc38c11011f43bc2982de Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 11 Dec 2022 11:29:02 -0700 Subject: [PATCH 47/72] Update for build changes --- cloud-minecraft/cloud-sponge/build.gradle.kts | 2 +- examples/example-sponge/build.gradle.kts | 5 +++-- settings.gradle.kts | 7 +++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-minecraft/cloud-sponge/build.gradle.kts index 64f9c032..0b56d3cf 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-minecraft/cloud-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { id("cloud.base-conventions") - id("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" + id("org.spongepowered.gradle.vanilla") } dependencies { diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 9cf11308..a5e00d40 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders import org.spongepowered.plugin.metadata.model.PluginDependency plugins { - id("org.spongepowered.gradle.plugin") version "2.0.1" + id("org.spongepowered.gradle.plugin") version "2.1.1" id("com.github.johnrengelman.shadow") } @@ -12,6 +12,7 @@ dependencies { } sponge { + injectRepositories(false) apiVersion("8.0.0") plugin("cloud-example-sponge") { loader { @@ -30,7 +31,7 @@ sponge { } tasks { - build { + assemble { dependsOn(shadowJar) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 80b090d2..b5ea1f33 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,9 @@ pluginManagement { mavenContent { snapshotsOnly() } } maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.spongepowered.org/repository/maven-public/") { + mavenContent { includeGroup("org.spongepowered") } + } maven("https://maven.fabricmc.net/") maven("https://maven.neoforged.net/releases/") maven("https://maven.architectury.dev/") @@ -17,6 +20,7 @@ pluginManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" id("xyz.jpenilla.quiet-architectury-loom") version "1.7-SNAPSHOT" + id("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" } dependencyResolutionManagement { @@ -29,6 +33,9 @@ dependencyResolutionManagement { maven("https://repo.papermc.io/repository/maven-public/") maven("https://maven.fabricmc.net/") maven("https://maven.neoforged.net/releases/") + maven("https://repo.spongepowered.org/repository/maven-public/") { + mavenContent { includeGroup("org.spongepowered") } + } } } From aa4a68d1ff2f5d60cd380035e8830522ba2db2f3 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:27:50 -0700 Subject: [PATCH 48/72] Get sponge project to import --- .../cloud-sponge => cloud-sponge}/build.gradle.kts | 4 ++-- .../cloud/commandframework/sponge/CloudInjectionModule.java | 0 .../cloud/commandframework/sponge/CloudSpongeCommand.java | 0 .../commandframework/sponge/NodeSupplyingArgumentParser.java | 0 .../cloud/commandframework/sponge/SpongeCaptionKeys.java | 0 .../cloud/commandframework/sponge/SpongeCaptionRegistry.java | 0 .../commandframework/sponge/SpongeCommandContextKeys.java | 0 .../cloud/commandframework/sponge/SpongeCommandManager.java | 0 .../commandframework/sponge/SpongeCommandPreprocessor.java | 0 .../cloud/commandframework/sponge/SpongeParserMapper.java | 0 .../commandframework/sponge/SpongeParserParameters.java | 0 .../commandframework/sponge/SpongeRegistrationHandler.java | 0 .../commandframework/sponge/annotation/package-info.java | 0 .../commandframework/sponge/annotation/specifier/Center.java | 0 .../sponge/annotation/specifier/package-info.java | 0 .../commandframework/sponge/argument/BlockInputArgument.java | 0 .../sponge/argument/BlockPredicateArgument.java | 0 .../commandframework/sponge/argument/ComponentArgument.java | 0 .../sponge/argument/DataContainerArgument.java | 0 .../sponge/argument/GameProfileArgument.java | 0 .../sponge/argument/GameProfileCollectionArgument.java | 0 .../sponge/argument/ItemStackPredicateArgument.java | 0 .../sponge/argument/MultipleEntitySelectorArgument.java | 0 .../sponge/argument/MultiplePlayerSelectorArgument.java | 0 .../sponge/argument/NamedTextColorArgument.java | 0 .../commandframework/sponge/argument/OperatorArgument.java | 0 .../sponge/argument/ProtoItemStackArgument.java | 0 .../sponge/argument/RegistryEntryArgument.java | 0 .../sponge/argument/ResourceKeyArgument.java | 0 .../commandframework/sponge/argument/ResourceKeyUtil.java | 0 .../sponge/argument/SingleEntitySelectorArgument.java | 0 .../sponge/argument/SinglePlayerSelectorArgument.java | 0 .../cloud/commandframework/sponge/argument/UserArgument.java | 0 .../commandframework/sponge/argument/Vector2dArgument.java | 0 .../commandframework/sponge/argument/Vector2iArgument.java | 0 .../commandframework/sponge/argument/Vector3dArgument.java | 0 .../commandframework/sponge/argument/Vector3iArgument.java | 0 .../commandframework/sponge/argument/VectorArgument.java | 0 .../commandframework/sponge/argument/WorldArgument.java | 0 .../cloud/commandframework/sponge/argument/package-info.java | 0 .../java/cloud/commandframework/sponge/data/BlockInput.java | 0 .../cloud/commandframework/sponge/data/BlockPredicate.java | 0 .../commandframework/sponge/data/GameProfileCollection.java | 0 .../commandframework/sponge/data/ItemStackPredicate.java | 0 .../commandframework/sponge/data/MultipleEntitySelector.java | 0 .../commandframework/sponge/data/MultiplePlayerSelector.java | 0 .../cloud/commandframework/sponge/data/ProtoItemStack.java | 0 .../cloud/commandframework/sponge/data/SelectorWrapper.java | 0 .../commandframework/sponge/data/SingleEntitySelector.java | 0 .../commandframework/sponge/data/SinglePlayerSelector.java | 0 .../cloud/commandframework/sponge/data/package-info.java | 0 .../sponge/exception/ComponentMessageRuntimeException.java | 0 .../commandframework/sponge/exception/package-info.java | 0 .../java/cloud/commandframework/sponge/package-info.java | 0 examples/example-sponge/build.gradle.kts | 2 +- settings.gradle.kts | 5 +++++ 56 files changed, 8 insertions(+), 3 deletions(-) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/build.gradle.kts (85%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/annotation/package-info.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/argument/package-info.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/BlockInput.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/data/package-info.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/exception/package-info.java (100%) rename {cloud-minecraft/cloud-sponge => cloud-sponge}/src/main/java/cloud/commandframework/sponge/package-info.java (100%) diff --git a/cloud-minecraft/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts similarity index 85% rename from cloud-minecraft/cloud-sponge/build.gradle.kts rename to cloud-sponge/build.gradle.kts index 0b56d3cf..c8387a31 100644 --- a/cloud-minecraft/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -1,12 +1,12 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { - id("cloud.base-conventions") + id("conventions.base") id("org.spongepowered.gradle.vanilla") } dependencies { - api(project(":cloud-core")) + api(libs.cloud.core) implementation(project(":cloud-brigadier")) compileOnly("org.spongepowered:spongeapi:8.1.0") compileOnly("org.spongepowered:sponge:1.16.5-8.1.0-SNAPSHOT") diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java diff --git a/cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java similarity index 100% rename from cloud-minecraft/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index a5e00d40..75faa946 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -3,7 +3,7 @@ import org.spongepowered.plugin.metadata.model.PluginDependency plugins { id("org.spongepowered.gradle.plugin") version "2.1.1" - id("com.github.johnrengelman.shadow") + alias(libs.plugins.shadow) } dependencies { diff --git a/settings.gradle.kts b/settings.gradle.kts index b5ea1f33..307ecf7e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,6 +14,11 @@ pluginManagement { maven("https://maven.architectury.dev/") maven("https://repo.jpenilla.xyz/snapshots/") } + repositories { + mavenCentral() + gradlePluginPortal() + maven("https://repo.spongepowered.org/repository/maven-public/") + } includeBuild("gradle/build-logic") } From 8024768df267448b951b23bf34cd04d6c6cb33df Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sat, 20 Jan 2024 19:22:41 -0700 Subject: [PATCH 49/72] Begin porting to cloud v2 --- .../sponge/CloudInjectionModule.java | 64 ++--- .../sponge/CloudSpongeCommand.java | 230 ++++++++---------- .../sponge/SpongeCaptionRegistry.java | 4 +- .../sponge/SpongeCommandContextKeys.java | 7 +- .../sponge/SpongeCommandManager.java | 160 ++++++------ .../sponge/SpongeCommandPreprocessor.java | 8 +- .../sponge/SpongeParserMapper.java | 126 +++++----- .../sponge/SpongeParserParameters.java | 4 +- .../sponge/SpongeRegistrationHandler.java | 20 +- .../examples/sponge/CloudExamplePlugin.java | 81 +++--- 10 files changed, 314 insertions(+), 390 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index 733d431e..e74043c8 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -23,14 +23,12 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandTree; -import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.SenderMapper; +import cloud.commandframework.execution.ExecutionCoordinator; import com.google.inject.AbstractModule; import com.google.inject.Key; import com.google.inject.util.Types; import java.lang.reflect.Type; -import java.util.function.Function; -import java.util.function.UnaryOperator; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.CommandCause; @@ -42,72 +40,56 @@ public final class CloudInjectionModule extends AbstractModule { private final Class commandSenderType; - private final Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator; - private final Function<@NonNull C, @NonNull CommandCause> causeMapper; - private final Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper; + private final ExecutionCoordinator executionCoordinator; + private final SenderMapper<@NonNull CommandCause, @NonNull C> senderMapper; /** * Create a new injection module. * - * @param commandSenderType Your command sender type - * @param commandExecutionCoordinator Command execution coordinator - * @param causeMapper Function mapping the custom command sender type to a Sponge CommandCause - * @param backwardsCauseMapper Function mapping Sponge CommandCause to the custom command sender type + * @param commandSenderType Your command sender type + * @param executionCoordinator Command execution coordinator + * @param senderMapper Function mapping the custom command sender type to a Sponge CommandCause */ public CloudInjectionModule( - final @NonNull Class commandSenderType, - final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, - final @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper, - final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper + final @NonNull Class commandSenderType, + final @NonNull ExecutionCoordinator executionCoordinator, + final @NonNull SenderMapper<@NonNull CommandCause, @NonNull C> senderMapper ) { this.commandSenderType = commandSenderType; - this.commandExecutionCoordinator = commandExecutionCoordinator; - this.causeMapper = causeMapper; - this.backwardsCauseMapper = backwardsCauseMapper; + this.executionCoordinator = executionCoordinator; + this.senderMapper = senderMapper; } /** * Create a new injection module using Sponge's {@link CommandCause} as the sender type. * - * @param commandExecutionCoordinator Command execution coordinator + * @param executionCoordinator Command execution coordinator * @return new injection module */ public static @NonNull CloudInjectionModule<@NonNull CommandCause> createNative( - final @NonNull Function<@NonNull CommandTree<@NonNull CommandCause>, - @NonNull CommandExecutionCoordinator<@NonNull CommandCause>> commandExecutionCoordinator + final @NonNull ExecutionCoordinator executionCoordinator ) { return new CloudInjectionModule<>( - CommandCause.class, - commandExecutionCoordinator, - UnaryOperator.identity(), - UnaryOperator.identity() + CommandCause.class, + executionCoordinator, + SenderMapper.identity() ); } @SuppressWarnings({"unchecked", "rawtypes"}) @Override protected void configure() { - final Type commandTreeType = Types.newParameterizedType(CommandTree.class, this.commandSenderType); final Type commandExecutionCoordinatorType = Types.newParameterizedType( - CommandExecutionCoordinator.class, this.commandSenderType + ExecutionCoordinator.class, this.commandSenderType ); - final Type executorFunction = Types.newParameterizedType( - Function.class, commandTreeType, commandExecutionCoordinatorType - ); - final Key executorFunctionKey = Key.get(executorFunction); - this.bind(executorFunctionKey).toInstance(this.commandExecutionCoordinator); + final Key coordinatorKey = Key.get(commandExecutionCoordinatorType); + this.bind(coordinatorKey).toInstance(this.executionCoordinator); final Type commandSenderMapperFunction = Types.newParameterizedType( - Function.class, this.commandSenderType, CommandCause.class - ); - final Key commandSenderMapperFunctionKey = Key.get(commandSenderMapperFunction); - this.bind(commandSenderMapperFunctionKey).toInstance(this.causeMapper); - - final Type backwardsCommandSenderMapperFunction = Types.newParameterizedType( - Function.class, CommandCause.class, this.commandSenderType + SenderMapper.class, CommandCause.class, this.commandSenderType ); - final Key backwardsCommandSenderMapperFunctionKey = Key.get(backwardsCommandSenderMapperFunction); - this.bind(backwardsCommandSenderMapperFunctionKey).toInstance(this.backwardsCauseMapper); + final Key senderMapperKey = Key.get(commandSenderMapperFunction); + this.bind(senderMapperKey).toInstance(this.senderMapper); } } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 5df0ef86..d05dd938 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -23,25 +23,22 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandTree; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.StaticArgument; -import cloud.commandframework.arguments.compound.CompoundArgument; -import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.CommandComponent; +import cloud.commandframework.arguments.LiteralParser; +import cloud.commandframework.arguments.compound.CompoundParser; import cloud.commandframework.exceptions.ArgumentParseException; import cloud.commandframework.exceptions.CommandExecutionException; import cloud.commandframework.exceptions.InvalidCommandSenderException; import cloud.commandframework.exceptions.InvalidSyntaxException; import cloud.commandframework.exceptions.NoPermissionException; import cloud.commandframework.exceptions.NoSuchCommandException; -import cloud.commandframework.permission.CommandPermission; +import cloud.commandframework.internal.CommandNode; import cloud.commandframework.permission.Permission; import cloud.commandframework.types.tuples.Pair; import java.util.ArrayDeque; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.concurrent.CompletionException; import java.util.stream.Collectors; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; @@ -62,18 +59,18 @@ final class CloudSpongeCommand implements Command.Raw { private static final Component NULL = text("null"); private static final Component MESSAGE_INTERNAL_ERROR = - text("An internal error occurred while attempting to perform this command.", RED); + text("An internal error occurred while attempting to perform this command.", RED); private static final Component MESSAGE_NO_PERMS = - text("I'm sorry, but you do not have permission to perform this command. " - + "Please contact the server administrators if you believe that this is in error.", RED); + text("I'm sorry, but you do not have permission to perform this command. " + + "Please contact the server administrators if you believe that this is in error.", RED); private static final Component MESSAGE_UNKNOWN_COMMAND = text("Unknown command. Type \"/help\" for help."); private final SpongeCommandManager commandManager; private final String label; CloudSpongeCommand( - final @NonNull String label, - final @NonNull SpongeCommandManager commandManager + final @NonNull String label, + final @NonNull SpongeCommandManager commandManager ) { this.label = label; this.commandManager = commandManager; @@ -81,79 +78,52 @@ final class CloudSpongeCommand implements Command.Raw { @Override public CommandResult process(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { - final C cloudSender = this.commandManager.backwardsCauseMapper().apply(cause); - final Audience audience = cause.audience(); + final C cloudSender = this.commandManager.senderMapper().map(cause); final String input = this.formatCommandForParsing(arguments.input()); - this.commandManager.executeCommand(cloudSender, input).whenComplete((result, throwable) -> { - if (throwable == null) { - return; - } - if (throwable instanceof CompletionException) { - throwable = throwable.getCause(); - } - this.handleCommandException(cloudSender, audience, throwable); - }); + this.commandManager.commandExecutor().executeCommand(cloudSender, input); return CommandResult.success(); } - private void handleCommandException(final C cloudSender, final Audience audience, final Throwable throwable) { - if (throwable instanceof InvalidSyntaxException) { - this.commandManager.handleException( - cloudSender, - InvalidSyntaxException.class, - (InvalidSyntaxException) throwable, - (c, e) -> audience.sendMessage(text().append( - text("Invalid Command Syntax. Correct command syntax is: ", RED), - text("/" + e.getCorrectSyntax(), GRAY) - ).build()) - ); - } else if (throwable instanceof InvalidCommandSenderException) { - this.commandManager.handleException( - cloudSender, - InvalidCommandSenderException.class, - (InvalidCommandSenderException) throwable, - (c, e) -> audience.sendMessage(text(throwable.getMessage(), RED)) - ); - } else if (throwable instanceof NoPermissionException) { - this.commandManager.handleException( - cloudSender, - NoPermissionException.class, - (NoPermissionException) throwable, - (c, e) -> audience.sendMessage(MESSAGE_NO_PERMS) - ); - } else if (throwable instanceof NoSuchCommandException) { - this.commandManager.handleException( - cloudSender, - NoSuchCommandException.class, - (NoSuchCommandException) throwable, - (c, e) -> audience.sendMessage(MESSAGE_UNKNOWN_COMMAND) - ); - } else if (throwable instanceof ArgumentParseException) { - this.commandManager.handleException( - cloudSender, - ArgumentParseException.class, - (ArgumentParseException) throwable, - (c, e) -> audience.sendMessage(text().append( - text("Invalid Command Argument: ", RED), - getMessage(throwable.getCause()).colorIfAbsent(GRAY) - ).build()) - ); - } else if (throwable instanceof CommandExecutionException) { - this.commandManager.handleException( - cloudSender, - CommandExecutionException.class, - (CommandExecutionException) throwable, - (c, e) -> { - audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.owningPluginContainer().logger() - .error("Exception executing command handler", throwable.getCause()); - } - ); - } else { + // todo + public static void registerExceptionHandlers(final SpongeCommandManager mgr) { + mgr.exceptionController().registerHandler(InvalidSyntaxException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text().append( + text("Invalid Command Syntax. Correct command syntax is: ", RED), + text("/" + ctx.exception().correctSyntax(), GRAY) + ).build()); + }); + mgr.exceptionController().registerHandler(InvalidCommandSenderException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text(ctx.exception().getMessage(), RED)); + }); + mgr.exceptionController().registerHandler(NoPermissionException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_NO_PERMS); + }); + mgr.exceptionController().registerHandler(NoSuchCommandException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_UNKNOWN_COMMAND); + }); + mgr.exceptionController().registerHandler(ArgumentParseException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text().append( + text("Invalid Command Argument: ", RED), + getMessage(ctx.exception().getCause()).colorIfAbsent(GRAY) + ).build()); + }); + mgr.exceptionController().registerHandler(CommandExecutionException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); audience.sendMessage(MESSAGE_INTERNAL_ERROR); - this.commandManager.owningPluginContainer().logger() - .error("An unhandled exception was thrown during command execution", throwable); - } + mgr.owningPluginContainer().logger() + .error("Exception executing command handler", ctx.exception().getCause()); + }); + mgr.exceptionController().registerHandler(Throwable.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + mgr.owningPluginContainer().logger() + .error("An unhandled exception was thrown during command execution", ctx.exception()); + }); } private static Component getMessage(final Throwable throwable) { @@ -163,48 +133,45 @@ private static Component getMessage(final Throwable throwable) { @Override public List complete( - final @NonNull CommandCause cause, - final ArgumentReader.@NonNull Mutable arguments + final @NonNull CommandCause cause, + final ArgumentReader.@NonNull Mutable arguments ) { - return this.commandManager.suggest( - this.commandManager.backwardsCauseMapper().apply(cause), - this.formatCommandForSuggestions(arguments.input()) - ).stream().map(CommandCompletion::of).collect(Collectors.toList()); + return this.commandManager.suggestionFactory().suggestImmediately( + this.commandManager.senderMapper().map(cause), + this.formatCommandForSuggestions(arguments.input()) + // todo + ).list().stream().map(s -> CommandCompletion.of(s.suggestion())).collect(Collectors.toList()); } @Override public boolean canExecute(final @NonNull CommandCause cause) { - return this.commandManager.hasPermission( - this.commandManager.backwardsCauseMapper().apply(cause), - (CommandPermission) this.namedNode().getNodeMeta().getOrDefault("permission", Permission.empty()) - ); + return this.commandManager.testPermission( + this.commandManager.senderMapper().map(cause), + (Permission) this.namedNode().nodeMeta().getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()) + ).allowed(); } @Override public Optional shortDescription(final CommandCause cause) { - return Optional.of(this.usage()); + return Optional.of(this.usage(cause)); } @Override public Optional extendedDescription(final CommandCause cause) { - return Optional.of(this.usage()); + return Optional.of(this.usage(cause)); } @Override public Optional help(final @NonNull CommandCause cause) { - return Optional.of(this.usage()); + return Optional.of(this.usage(cause)); } @Override public Component usage(final CommandCause cause) { - return this.usage(); - } - - private Component usage() { - return text(this.commandManager.commandSyntaxFormatter().apply(Collections.emptyList(), this.namedNode())); + return text(this.commandManager.commandSyntaxFormatter().apply(this.commandManager.senderMapper().map(cause), Collections.emptyList(), this.namedNode())); } - private CommandTree.Node> namedNode() { + private CommandNode namedNode() { return this.commandManager.commandTree().getNamedNode(this.label); } @@ -212,9 +179,9 @@ private Component usage() { public CommandTreeNode.Root commandTree() { final CommandTreeNode root = CommandTreeNode.root(); - final CommandTree.Node> cloud = this.namedNode(); + final CommandNode cloud = this.namedNode(); - if (cloud.isLeaf() || cloud.getValue().getOwningCommand() != null) { + if (cloud.isLeaf() || cloud.command() != null) { root.executable(); } @@ -224,81 +191,76 @@ public CommandTreeNode.Root commandTree() { return (CommandTreeNode.Root) root; } - @SuppressWarnings("unchecked") - private void addChildren(final CommandTreeNode node, final CommandTree.Node> cloud) { - for (final CommandTree.Node> child : cloud.getChildren()) { - final CommandArgument value = child.getValue(); + private void addChildren(final CommandTreeNode node, final CommandNode cloud) { + for (final CommandNode child : cloud.children()) { + final CommandComponent value = child.component(); final CommandTreeNode.Argument> treeNode; - if (value instanceof StaticArgument) { + if (value.parser() instanceof LiteralParser) { treeNode = (CommandTreeNode.Argument>) CommandTreeNode.literal(); - } else if (value instanceof CompoundArgument) { - final CompoundArgument compound = (CompoundArgument) value; + } else if (value.parser() instanceof CompoundParser) { + final CompoundParser compound = (CompoundParser) value.parser(); this.handleCompoundArgument(node, child, compound); continue; } else { - treeNode = this.commandManager.parserMapper().mapArgument(value); + treeNode = this.commandManager.parserMapper().mapComponent(value); } this.addRequirement(child, treeNode); if (canExecute(child)) { treeNode.executable(); } this.addChildren(treeNode, child); - node.child(value.getName(), treeNode); + node.child(value.name(), treeNode); } } - @SuppressWarnings("unchecked") private void handleCompoundArgument( - final CommandTreeNode node, - final CommandTree.Node> child, - final CompoundArgument compound + final CommandTreeNode node, + final CommandNode child, + final CompoundParser compound ) { final CommandTreeNode.Argument> treeNode; - final Object[] names = compound.getNames().toArray(); - final Object[] parsers = compound.getParserTuple().toArray(); final ArrayDeque>>> nodes = new ArrayDeque<>(); - for (int i = 0; i < parsers.length; i++) { - final ArgumentParser parser = (ArgumentParser) parsers[i]; - final String name = (String) names[i]; - nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(parser))); + for (final CommandComponent component : compound.components()) { + final String name = component.name(); + nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(component.parser()))); } Pair>> argument = null; while (!nodes.isEmpty()) { final Pair>> prev = argument; argument = nodes.removeLast(); if (prev != null) { - argument.getSecond().child(prev.getFirst(), prev.getSecond()); + argument.second().child(prev.first(), prev.second()); } else { // last node if (canExecute(child)) { - argument.getSecond().executable(); + argument.second().executable(); } } - this.addRequirement(child, argument.getSecond()); + this.addRequirement(child, argument.second()); } - treeNode = argument.getSecond(); + treeNode = argument.second(); this.addChildren(treeNode, child); - node.child(names[0].toString(), treeNode); + node.child(compound.components().get(0).toString(), treeNode); } - private static boolean canExecute(final CommandTree.@NonNull Node> node) { + private static boolean canExecute(final @NonNull CommandNode node) { return node.isLeaf() - || !node.getValue().isRequired() - || node.getValue().getOwningCommand() != null - || node.getChildren().stream().noneMatch(c -> c.getValue().isRequired()); + || !node.component().required() + || node.command() != null + || node.children().stream().noneMatch(c -> c.component().required()); } private void addRequirement( - final CommandTree.@NonNull Node> cloud, - final @NonNull CommandTreeNode> node + final @NonNull CommandNode cloud, + final @NonNull CommandTreeNode> node ) { - final CommandPermission permission = (CommandPermission) cloud.getNodeMeta() - .getOrDefault("permission", Permission.empty()); + final Permission permission = (Permission) cloud.nodeMeta() + .getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()); if (permission == Permission.empty()) { return; } node.requires(cause -> - this.commandManager.hasPermission(this.commandManager.backwardsCauseMapper().apply(cause), permission)); + this.commandManager.testPermission(this.commandManager.senderMapper().map(cause), permission).allowed()); } private String formatCommandForParsing(final @NonNull String arguments) { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index d6396215..d6ef55e4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -23,14 +23,14 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.captions.SimpleCaptionRegistry; +import cloud.commandframework.captions.StandardCaptionRegistry; /** * Caption registry that uses bi-functions to produce messages. * * @param command sender type */ -public class SpongeCaptionRegistry extends SimpleCaptionRegistry { +public class SpongeCaptionRegistry extends StandardCaptionRegistry { /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index a44d1cb8..89162c7c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -24,7 +24,6 @@ package cloud.commandframework.sponge; import cloud.commandframework.keys.CloudKey; -import cloud.commandframework.keys.SimpleCloudKey; import io.leangen.geantyref.TypeToken; import org.spongepowered.api.command.CommandCause; @@ -37,9 +36,9 @@ public final class SpongeCommandContextKeys { * The Sponge native {@link org.spongepowered.api.command.CommandCause} instance is stored in the {@link cloud.commandframework.context.CommandContext} * by {@link SpongeCommandPreprocessor} */ - public static final CloudKey COMMAND_CAUSE = SimpleCloudKey.of( - "cloud:sponge_command_cause", - TypeToken.get(CommandCause.class) + public static final CloudKey COMMAND_CAUSE = CloudKey.of( + "cloud:sponge_command_cause", + TypeToken.get(CommandCause.class) ); private SpongeCommandContextKeys() { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 4275bc2a..20b9fb3c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -24,9 +24,10 @@ package cloud.commandframework.sponge; import cloud.commandframework.CommandManager; -import cloud.commandframework.CommandTree; +import cloud.commandframework.SenderMapper; +import cloud.commandframework.SenderMapperHolder; import cloud.commandframework.arguments.parser.ParserParameters; -import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.execution.ExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.sponge.annotation.specifier.Center; @@ -60,6 +61,7 @@ import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.data.SingleEntitySelector; import cloud.commandframework.sponge.data.SinglePlayerSelector; +import cloud.commandframework.state.RegistrationState; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Module; @@ -70,7 +72,6 @@ import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; -import java.util.function.Function; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.ResourceKey; @@ -101,39 +102,37 @@ * * @param Command sender type */ -public final class SpongeCommandManager extends CommandManager { +public final class SpongeCommandManager extends CommandManager implements SenderMapperHolder { private final PluginContainer pluginContainer; - private final Function causeMapper; - private final Function backwardsCauseMapper; + private final SenderMapper senderMapper; private final SpongeParserMapper parserMapper; /** * Create a new command manager instance * - * @param pluginContainer Owning plugin - * @param commandExecutionCoordinator Execution coordinator instance - * @param causeMapper Function mapping the custom command sender type to a Sponge CommandCause - * @param backwardsCauseMapper Function mapping Sponge CommandCause to the custom command sender type + * @param pluginContainer Owning plugin + * @param executionCoordinator Execution coordinator instance + * @param senderMapper Function mapping the custom command sender type to a Sponge CommandCause */ @SuppressWarnings("unchecked") @Inject public SpongeCommandManager( - final @NonNull PluginContainer pluginContainer, - final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, - final @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper, - final @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper + final @NonNull PluginContainer pluginContainer, + final @NonNull ExecutionCoordinator executionCoordinator, + final @NonNull SenderMapper senderMapper ) { - super(commandExecutionCoordinator, new SpongeRegistrationHandler()); + super(executionCoordinator, new SpongeRegistrationHandler()); this.checkLateCreation(); this.pluginContainer = pluginContainer; ((SpongeRegistrationHandler) this.commandRegistrationHandler()).initialize(this); - this.causeMapper = causeMapper; - this.backwardsCauseMapper = backwardsCauseMapper; + this.senderMapper = senderMapper; this.parserMapper = new SpongeParserMapper<>(); this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); this.captionRegistry(new SpongeCaptionRegistry<>()); + + CloudSpongeCommand.registerExceptionHandlers(this); } private void checkLateCreation() { @@ -142,102 +141,102 @@ private void checkLateCreation() { return; } throw new IllegalStateException( - "SpongeCommandManager must be created before the first firing of RegisterCommandEvent. (created too late)" + "SpongeCommandManager must be created before the first firing of RegisterCommandEvent. (created too late)" ); } private void registerParsers() { this.parserRegistry().registerParserSupplier( - TypeToken.get(ComponentArgument.class), - params -> new ComponentArgument.Parser<>() + TypeToken.get(ComponentArgument.class), + params -> new ComponentArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(NamedTextColor.class), - params -> new NamedTextColorArgument.Parser<>() + TypeToken.get(NamedTextColor.class), + params -> new NamedTextColorArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(Operator.class), - params -> new OperatorArgument.Parser<>() + TypeToken.get(Operator.class), + params -> new OperatorArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(ServerWorld.class), - params -> new WorldArgument.Parser<>() + TypeToken.get(ServerWorld.class), + params -> new WorldArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(ProtoItemStack.class), - params -> new ProtoItemStackArgument.Parser<>() + TypeToken.get(ProtoItemStack.class), + params -> new ProtoItemStackArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(ItemStackPredicate.class), - params -> new ItemStackPredicateArgument.Parser<>() + TypeToken.get(ItemStackPredicate.class), + params -> new ItemStackPredicateArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(ResourceKey.class), - params -> new ResourceKeyArgument.Parser<>() + TypeToken.get(ResourceKey.class), + params -> new ResourceKeyArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(GameProfile.class), - params -> new GameProfileArgument.Parser<>() + TypeToken.get(GameProfile.class), + params -> new GameProfileArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(GameProfileCollection.class), - params -> new GameProfileCollectionArgument.Parser<>() + TypeToken.get(GameProfileCollection.class), + params -> new GameProfileCollectionArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(BlockInputArgument.class), - params -> new BlockInputArgument.Parser<>() + TypeToken.get(BlockInputArgument.class), + params -> new BlockInputArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(BlockPredicate.class), - params -> new BlockPredicateArgument.Parser<>() + TypeToken.get(BlockPredicate.class), + params -> new BlockPredicateArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(User.class), - params -> new UserArgument.Parser<>() + TypeToken.get(User.class), + params -> new UserArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(DataContainer.class), - params -> new DataContainerArgument.Parser<>() + TypeToken.get(DataContainer.class), + params -> new DataContainerArgument.Parser<>() ); // Position arguments this.parserRegistry().registerAnnotationMapper( - Center.class, - (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) + Center.class, + (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) ); this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector2d.class), - params -> new Vector2dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + TypeToken.get(Vector2d.class), + params -> new Vector2dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) ); this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector3d.class), - params -> new Vector3dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + TypeToken.get(Vector3d.class), + params -> new Vector3dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) ); this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector2i.class), - params -> new Vector2iArgument.Parser<>() + TypeToken.get(Vector2i.class), + params -> new Vector2iArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector3i.class), - params -> new Vector3iArgument.Parser<>() + TypeToken.get(Vector3i.class), + params -> new Vector3iArgument.Parser<>() ); // Entity selectors this.parserRegistry().registerParserSupplier( - TypeToken.get(SinglePlayerSelector.class), - params -> new SinglePlayerSelectorArgument.Parser<>() + TypeToken.get(SinglePlayerSelector.class), + params -> new SinglePlayerSelectorArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(MultiplePlayerSelector.class), - params -> new MultiplePlayerSelectorArgument.Parser<>() + TypeToken.get(MultiplePlayerSelector.class), + params -> new MultiplePlayerSelectorArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(SingleEntitySelector.class), - params -> new SingleEntitySelectorArgument.Parser<>() + TypeToken.get(SingleEntitySelector.class), + params -> new SingleEntitySelectorArgument.Parser<>() ); this.parserRegistry().registerParserSupplier( - TypeToken.get(MultipleEntitySelector.class), - params -> new MultipleEntitySelectorArgument.Parser<>() + TypeToken.get(MultipleEntitySelector.class), + params -> new MultipleEntitySelectorArgument.Parser<>() ); this.registerRegistryParsers(); @@ -245,7 +244,7 @@ private void registerParsers() { private void registerRegistryParsers() { final Set> ignoredRegistryTypes = ImmutableSet.of( - RegistryTypes.OPERATOR // We have a different Operator parser that doesn't use a ResourceKey as input + RegistryTypes.OPERATOR // We have a different Operator parser that doesn't use a ResourceKey as input ); for (final Field field : RegistryTypes.class.getDeclaredFields()) { final Type generic = field.getGenericType(); /* RegistryType */ @@ -266,21 +265,21 @@ private void registerRegistryParsers() { final Type valueType = ((ParameterizedType) generic).getActualTypeArguments()[0]; this.parserRegistry().registerParserSupplier( - TypeToken.get(valueType), - params -> new RegistryEntryArgument.Parser<>(defaultedRegistryType) + TypeToken.get(valueType), + params -> new RegistryEntryArgument.Parser<>(defaultedRegistryType) ); } } @Override public boolean hasPermission( - @NonNull final C sender, - @NonNull final String permission + @NonNull final C sender, + @NonNull final String permission ) { if (permission.isEmpty()) { return true; } - return this.causeMapper.apply(sender).hasPermission(permission); + return this.senderMapper.reverse(sender).hasPermission(permission); } @Override @@ -299,7 +298,7 @@ public boolean hasPermission( /** * Get the {@link SpongeParserMapper}, responsible for mapping Cloud - * {@link cloud.commandframework.arguments.CommandArgument CommandArguments} to Sponge + * {@link cloud.commandframework.arguments.parser.ArgumentParser ArgumentParser} to Sponge * {@link org.spongepowered.api.command.registrar.tree.CommandTreeNode.Argument CommandTreeNode.Arguments}. * * @return the parser mapper @@ -308,22 +307,9 @@ public boolean hasPermission( return this.parserMapper; } - /** - * Get the {@link Function} used to map {@link C command senders} to {@link CommandCause CommandCauses}. - * - * @return command cause mapper - */ - public @NonNull Function<@NonNull C, @NonNull CommandCause> causeMapper() { - return this.causeMapper; - } - - /** - * Get the {@link Function} used to map {@link CommandCause CommandCauses} to {@link C command senders}. - * - * @return backwards command cause mapper - */ - public @NonNull Function<@NonNull CommandCause, @NonNull C> backwardsCauseMapper() { - return this.backwardsCauseMapper; + @Override + public @NonNull SenderMapper senderMapper() { + return this.senderMapper; } void registrationCalled() { @@ -331,7 +317,7 @@ void registrationCalled() { this.registrationCallbackListeners.forEach(listener -> listener.accept(this)); this.registrationCallbackListeners.clear(); } - if (this.registrationState() != RegistrationState.AFTER_REGISTRATION) { + if (this.state() != RegistrationState.AFTER_REGISTRATION) { this.lockRegistration(); } } @@ -351,7 +337,7 @@ void registrationCalled() { * @param listener listener */ public void addRegistrationCallbackListener(final @NonNull Consumer<@NonNull SpongeCommandManager> listener) { - if (this.registrationState() == RegistrationState.AFTER_REGISTRATION) { + if (this.state() == RegistrationState.AFTER_REGISTRATION) { throw new IllegalStateException("The SpongeCommandManager is in the AFTER_REGISTRATION state!"); } this.registrationCallbackListeners.add(listener); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index f5c7190f..d8ec686d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -23,7 +23,7 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import cloud.commandframework.execution.preprocessor.CommandPreprocessor; import org.checkerframework.checker.nullness.qual.NonNull; @@ -50,13 +50,13 @@ final class SpongeCommandPreprocessor implements CommandPreprocessor { @Override public void accept(final @NonNull CommandPreprocessingContext context) { - final CommandCause commandCause = this.commandManager.causeMapper().apply(context.getCommandContext().getSender()); - context.getCommandContext().store(SpongeCommandContextKeys.COMMAND_CAUSE, commandCause); + final CommandCause commandCause = this.commandManager.senderMapper().reverse(context.commandContext().sender()); + context.commandContext().store(SpongeCommandContextKeys.COMMAND_CAUSE, commandCause); // For WrappedBrigadierParser. The CloudBrigadierManager will store this in context as well, however we are not using // the CloudBrigadierManager, only the WrapperBrigadierParser. CommandCause is mixed into CommandSourceStack, which is // Minecraft's native Brigadier sender type on the server. - context.getCommandContext().store(WrappedBrigadierParser.COMMAND_CONTEXT_BRIGADIER_NATIVE_SENDER, commandCause); + context.commandContext().store(WrappedBrigadierParser.COMMAND_CONTEXT_BRIGADIER_NATIVE_SENDER, commandCause); } } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index f12fb0e3..50d0c844 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -23,20 +23,20 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.compound.FlagArgument; +import cloud.commandframework.CommandComponent; +import cloud.commandframework.arguments.flags.CommandFlagParser; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.arguments.parser.MappedArgumentParser; -import cloud.commandframework.arguments.standard.BooleanArgument; -import cloud.commandframework.arguments.standard.ByteArgument; -import cloud.commandframework.arguments.standard.DoubleArgument; -import cloud.commandframework.arguments.standard.FloatArgument; -import cloud.commandframework.arguments.standard.IntegerArgument; -import cloud.commandframework.arguments.standard.LongArgument; -import cloud.commandframework.arguments.standard.ShortArgument; -import cloud.commandframework.arguments.standard.StringArgument; -import cloud.commandframework.arguments.standard.StringArrayArgument; -import cloud.commandframework.arguments.standard.UUIDArgument; +import cloud.commandframework.arguments.standard.BooleanParser; +import cloud.commandframework.arguments.standard.ByteParser; +import cloud.commandframework.arguments.standard.DoubleParser; +import cloud.commandframework.arguments.standard.FloatParser; +import cloud.commandframework.arguments.standard.IntegerParser; +import cloud.commandframework.arguments.standard.LongParser; +import cloud.commandframework.arguments.standard.ShortParser; +import cloud.commandframework.arguments.standard.StringArrayParser; +import cloud.commandframework.arguments.standard.StringParser; +import cloud.commandframework.arguments.standard.UUIDParser; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; import java.util.HashMap; @@ -73,9 +73,11 @@ public final class SpongeParserMapper { this.initStandardMappers(); } - CommandTreeNode.Argument> mapArgument(final CommandArgument value) { - final CommandTreeNode.Argument> result = this.mapParser(value.getParser()); - final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(value.getSuggestionsProvider()); + CommandTreeNode.Argument> mapComponent(final CommandComponent commandComponent) { + final CommandTreeNode.Argument> result = this.mapParser(commandComponent.parser()); + // final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(commandComponent.getSuggestionsProvider()); + // todo: not exactly the same as in v1... + final boolean customSuggestionsProvider = commandComponent.parser() != commandComponent.suggestionProvider(); if (customSuggestionsProvider) { result.customCompletions(); } @@ -87,12 +89,12 @@ CommandTreeNode.Argument> mapParser(final final CommandTreeNode.Argument> result; ArgumentParser parser = argumentParser; while (parser instanceof MappedArgumentParser) { - parser = ((MappedArgumentParser) parser).getBaseParser(); + parser = ((MappedArgumentParser) parser).baseParser(); } final Mapping mapper = this.mappers.get(parser.getClass()); if (mapper != null) { final CommandTreeNode.Argument> apply = - (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); + (CommandTreeNode.Argument>) ((Function) mapper.mapper).apply(parser); if (mapper.cloudSuggestions) { apply.customCompletions(); return apply; @@ -107,89 +109,89 @@ CommandTreeNode.Argument> mapParser(final } private void initStandardMappers() { - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(stringParser -> { - final StringArgument.StringMode mode = stringParser.getStringMode(); - if (mode == StringArgument.StringMode.SINGLE) { + final StringParser.StringMode mode = stringParser.stringMode(); + if (mode == StringParser.StringMode.SINGLE) { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word(); - } else if (mode == StringArgument.StringMode.QUOTED) { + } else if (mode == StringParser.StringMode.QUOTED) { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions(); - } else if (mode == StringArgument.StringMode.GREEDY || mode == StringArgument.StringMode.GREEDY_FLAG_YIELDING) { + } else if (mode == StringParser.StringMode.GREEDY || mode == StringParser.StringMode.GREEDY_FLAG_YIELDING) { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); } throw new IllegalArgumentException("Unknown string mode '" + mode + "'!"); })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(byteParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); - node.min((int) byteParser.getMin()); - node.max((int) byteParser.getMax()); + node.min((int) byteParser.range().minByte()); + node.max((int) byteParser.range().maxByte()); return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(shortParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); - node.min((int) shortParser.getMin()); - node.max((int) shortParser.getMax()); + node.min((int) shortParser.range().minShort()); + node.max((int) shortParser.range().maxShort()); return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(integerParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); if (integerParser.hasMin()) { - node.min(integerParser.getMin()); + node.min(integerParser.range().minInt()); } if (integerParser.hasMax()) { - node.max(integerParser.getMax()); + node.max(integerParser.range().maxInt()); } return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(floatParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.FLOAT.get().createNode(); if (floatParser.hasMin()) { - node.min(floatParser.getMin()); + node.min(floatParser.range().minFloat()); } if (floatParser.hasMax()) { - node.max(floatParser.getMax()); + node.max(floatParser.range().maxFloat()); } return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(doubleParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.DOUBLE.get().createNode(); if (doubleParser.hasMin()) { - node.min(doubleParser.getMin()); + node.min(doubleParser.range().minDouble()); } if (doubleParser.hasMax()) { - node.max(doubleParser.getMax()); + node.max(doubleParser.range().maxDouble()); } return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(longParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.LONG.get().createNode(); if (longParser.hasMin()) { - node.min(longParser.getMin()); + node.min(longParser.range().minLong()); } if (longParser.hasMax()) { - node.max(longParser.getMax()); + node.max(longParser.range().maxLong()); } return node; })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(booleanParser -> { return CommandTreeNodeTypes.BOOL.get().createNode(); })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(flagArgumentParser -> { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(stringArrayParser -> { return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy(); })); - this.registerMapping(new TypeToken>() { + this.registerMapping(new TypeToken>() { }, builder -> builder.to(uuidParser -> { return CommandTreeNodeTypes.UUID.get().createNode(); })); @@ -204,8 +206,8 @@ private void initStandardMappers() { * @param cloud argument parser type */ public > void registerMapping( - final @NonNull TypeToken cloudType, - final @NonNull Consumer> configurer + final @NonNull TypeToken cloudType, + final @NonNull Consumer> configurer ) { final MappingBuilderImpl builder = new MappingBuilderImpl<>(); configurer.accept(builder); @@ -223,20 +225,20 @@ private void initStandardMappers() { * @throws IllegalArgumentException when there is no mapper registered for the provided argument type */ public > void cloudSuggestions( - final @NonNull TypeToken parserType, - final boolean cloudSuggestions + final @NonNull TypeToken parserType, + final boolean cloudSuggestions ) throws IllegalArgumentException { final Mapping mapping = this.mappers.get(GenericTypeReflector.erase(parserType.getType())); if (mapping == null) { throw new IllegalArgumentException( - "No mapper registered for type: " + GenericTypeReflector - .erase(parserType.getType()) - .toGenericString() + "No mapper registered for type: " + GenericTypeReflector + .erase(parserType.getType()) + .toGenericString() ); } this.mappers.put( - GenericTypeReflector.erase(parserType.getType()), - new Mapping<>(mapping.mapper, cloudSuggestions) + GenericTypeReflector.erase(parserType.getType()), + new Mapping<>(mapping.mapper, cloudSuggestions) ); } @@ -247,17 +249,17 @@ public > void cloudSuggestions( * @param cloudNumberSuggestions whether to use Cloud number suggestions */ public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { + this.cloudSuggestions(new TypeToken>() { }, cloudNumberSuggestions); } @@ -302,7 +304,7 @@ private static final class MappingBuilderImpl> @Override public @NonNull MappingBuilder to( - final @NonNull Function>> mapper + final @NonNull Function>> mapper ) { this.mapper = mapper; return this; @@ -321,8 +323,8 @@ private static final class Mapping> { private final boolean cloudSuggestions; private Mapping( - final Function>> mapper, - final boolean cloudSuggestions + final Function>> mapper, + final boolean cloudSuggestions ) { this.mapper = mapper; this.cloudSuggestions = cloudSuggestions; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java index 075f33ab..8f31a2ae 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java @@ -41,8 +41,8 @@ private SpongeParserParameters() { public static final ParserParameter CENTER_INTEGERS = create("center_integers", TypeToken.get(Boolean.class)); private static @NonNull ParserParameter create( - final @NonNull String key, - final @NonNull TypeToken expectedType + final @NonNull String key, + final @NonNull TypeToken expectedType ) { return new ParserParameter<>(key, expectedType); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 4c7a2401..76a8cc8a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -23,9 +23,8 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandTree; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.StaticArgument; +import cloud.commandframework.CommandComponent; +import cloud.commandframework.internal.CommandNode; import cloud.commandframework.internal.CommandRegistrationHandler; import io.leangen.geantyref.TypeToken; import java.util.HashSet; @@ -47,22 +46,20 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { SpongeRegistrationHandler() { } - @SuppressWarnings("unchecked") private void handleRegistrationEvent(final RegisterCommandEvent event) { this.commandManager.registrationCalled(); - for (final CommandTree.Node> node : this.commandManager.commandTree().getRootNodes()) { - final StaticArgument value = requireNonNull((StaticArgument) node.getValue()); - this.registerCommand(event, value); + for (final CommandNode node : this.commandManager.commandTree().rootNodes()) { + this.registerCommand(event, requireNonNull(node.component())); } } - private void registerCommand(final RegisterCommandEvent event, final StaticArgument rootLiteral) { - final String label = rootLiteral.getName(); + private void registerCommand(final RegisterCommandEvent event, final CommandComponent rootLiteral) { + final String label = rootLiteral.name(); event.register( this.commandManager.owningPluginContainer(), new CloudSpongeCommand<>(label, this.commandManager), label, - rootLiteral.getAlternativeAliases().toArray(new String[0]) + rootLiteral.alternativeAliases().toArray(new String[0]) ); } @@ -79,9 +76,8 @@ void initialize(final @NonNull SpongeCommandManager commandManager) { @SuppressWarnings("unchecked") @Override - public boolean registerCommand(final cloud.commandframework.@NonNull Command command) { + public boolean registerCommand(cloud.commandframework.@NonNull Command command) { this.registeredCommands.add((cloud.commandframework.Command) command); return true; } - } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 47b84b8f..3d587ce4 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -25,11 +25,8 @@ import cloud.commandframework.ArgumentDescription; import cloud.commandframework.Command; -import cloud.commandframework.arguments.standard.DoubleArgument; -import cloud.commandframework.arguments.standard.IntegerArgument; -import cloud.commandframework.arguments.standard.StringArgument; import cloud.commandframework.context.CommandContext; -import cloud.commandframework.execution.CommandExecutionCoordinator; +import cloud.commandframework.execution.ExecutionCoordinator; import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; @@ -129,7 +126,7 @@ public final class CloudExamplePlugin { public CloudExamplePlugin(final @NonNull Injector injector) { // Create child injector with cloud module final Injector childInjector = injector.createChildInjector( - CloudInjectionModule.createNative(CommandExecutionCoordinator.simpleCoordinator()) + CloudInjectionModule.createNative(ExecutionCoordinator.simpleCoordinator()) ); // Get command manager instance @@ -140,10 +137,10 @@ public CloudExamplePlugin(final @NonNull Injector injector) { this.commandManager.parserMapper().cloudNumberSuggestions(true); // Register minecraft-extras exception handlers - new MinecraftExceptionHandler() - .withDefaultHandlers() - .withDecorator(message -> Component.text().append(COMMAND_PREFIX, space(), message).build()) - .apply(this.commandManager, CommandCause::audience); + MinecraftExceptionHandler.create(CommandCause::audience) + .defaultHandlers() + .decorator(message -> Component.text().append(COMMAND_PREFIX, space(), message).build()) + .registerTo(this.commandManager); this.registerCommands(); } @@ -151,20 +148,20 @@ public CloudExamplePlugin(final @NonNull Injector injector) { private void registerCommands() { this.commandManager.command(this.commandManager.commandBuilder("cloud_test1") .permission("cloud.test1") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("cloud_test2") .literal("test") .literal("test1") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); final Command.Builder cloudTest3 = this.commandManager.commandBuilder("cloud_test3"); final Command.Builder test = cloudTest3.literal("test"); this.commandManager.command(test.argument(StringArgument.single("string_arg")) .literal("test2") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(test.literal("literal_arg") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(cloudTest3.literal("another_test") - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); final Command.Builder cloud = this.commandManager.commandBuilder("cloud"); this.commandManager.command(cloud.literal("string_test") .argument(StringArgument.single("single")) @@ -176,14 +173,14 @@ private void registerCommands() { .argument(IntegerArgument.newBuilder("gt0").withMin(1)) .argument(IntegerArgument.newBuilder("lt100").withMax(99)) .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(cloud.literal("enchantment_type_test") .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) .argument(IntegerArgument.optional("level", 1)) .handler(ctx -> { - final Object subject = ctx.getSender().subject(); + final Object subject = ctx.sender().subject(); if (!(subject instanceof Player)) { - ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); + ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); return; } final Player player = (Player) subject; @@ -210,7 +207,7 @@ private void registerCommands() { .argument(NamedTextColorArgument.of("color")) .argument(StringArgument.greedy("message")) .handler(ctx -> { - ctx.getSender().audience().sendMessage( + ctx.sender().audience().sendMessage( text(ctx.get("message"), ctx.get("color")) ); })); @@ -223,12 +220,12 @@ private void registerCommands() { final int second = ctx.get("second"); final Operator operator = ctx.get("operator"); if (!(operator instanceof Operator.Simple)) { - ctx.getSender().audience().sendMessage( + ctx.sender().audience().sendMessage( text("That type of operator is not applicable here!", RED) ); return; } - ctx.getSender().audience().sendMessage(text() + ctx.sender().audience().sendMessage(text() .color(AQUA) .append(text(first)) .append(space()) @@ -245,9 +242,9 @@ private void registerCommands() { .argument(OperatorArgument.of("operator")) .argument(DoubleArgument.of("value")) .handler(ctx -> { - final Object subject = ctx.getSender().subject(); + final Object subject = ctx.sender().subject(); if (!(subject instanceof Player)) { // todo: a solution to this - ctx.getSender().audience().sendMessage(text("This command is for players only!", RED)); + ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); return; } final Player player = (Player) subject; @@ -258,7 +255,7 @@ private void registerCommands() { return; } if (!(operator instanceof Operator.Simple)) { - ctx.getSender().audience().sendMessage( + ctx.sender().audience().sendMessage( text("That type of operator is not applicable here!", RED) ); return; @@ -270,7 +267,7 @@ private void registerCommands() { .argument(SinglePlayerSelectorArgument.of("player")) .handler(ctx -> { final Player player = ctx.get("player").getSingle(); - ctx.getSender().audience().sendMessage(Component.text().append( + ctx.sender().audience().sendMessage(Component.text().append( text("Display name of selected player: ", GRAY), player.displayName().get() ).build()); @@ -278,7 +275,7 @@ private void registerCommands() { this.commandManager.command(cloud.literal("world_test") .argument(WorldArgument.of("world")) .handler(ctx -> { - ctx.getSender().audience().sendMessage(text(ctx.get("world").key().asString())); + ctx.sender().audience().sendMessage(text(ctx.get("world").key().asString())); })); this.commandManager.command(cloud.literal("test_item") .argument(ProtoItemStackArgument.of("item")) @@ -296,13 +293,13 @@ private void registerCommands() { } builder.append(text("does not pass!", RED)); }); - ctx.getSender().audience().sendMessage(message); + ctx.sender().audience().sendMessage(message); })); this.commandManager.command(cloud.literal("test_entity_type") .argument(RegistryEntryArgument.of("type", new TypeToken>() { }, RegistryTypes.ENTITY_TYPE)) .handler(ctx -> { - ctx.getSender().audience().sendMessage(ctx.>get("type")); + ctx.sender().audience().sendMessage(ctx.>get("type")); })); final Function, RegistryHolder> holderFunction = ctx -> ctx.getSender() .location() @@ -315,20 +312,20 @@ private void registerCommands() { .registry(RegistryTypes.BIOME) .findValueKey(ctx.get("biome")) .orElseThrow(IllegalStateException::new); - ctx.getSender().audience().sendMessage(text(biomeKey.asString())); + ctx.sender().audience().sendMessage(text(biomeKey.asString())); })); this.commandManager.command(cloud.literal("test_sounds") .argument(RegistryEntryArgument.of("type", SoundType.class, RegistryTypes.SOUND_TYPE)) .handler(ctx -> { - ctx.getSender().audience().sendMessage(text(ctx.get("type").key().asString())); + ctx.sender().audience().sendMessage(text(ctx.get("type").key().asString())); })); this.commandManager.command(cloud.literal("summon_villager") .argument(RegistryEntryArgument.of("type", VillagerType.class, RegistryTypes.VILLAGER_TYPE)) .argument(RegistryEntryArgument.of("profession", ProfessionType.class, RegistryTypes.PROFESSION_TYPE)) .handler(ctx -> { - final ServerLocation loc = ctx.getSender().location().orElse(null); + final ServerLocation loc = ctx.sender().location().orElse(null); if (loc == null) { - ctx.getSender().audience().sendMessage(text("No location!")); + ctx.sender().audience().sendMessage(text("No location!")); return; } final ServerWorld world = loc.world(); @@ -336,25 +333,25 @@ private void registerCommands() { villager.offer(Keys.VILLAGER_TYPE, ctx.get("type")); villager.offer(Keys.PROFESSION_TYPE, ctx.get("profession")); if (world.spawnEntity(villager)) { - ctx.getSender().audience().sendMessage(text() + ctx.sender().audience().sendMessage(text() .append(text("Spawned entity!", GREEN)) .append(space()) .append(villager.displayName().get()) .hoverEvent(villager)); } else { - ctx.getSender().audience().sendMessage(text("failed to spawn :(")); + ctx.sender().audience().sendMessage(text("failed to spawn :(")); } })); this.commandManager.command(cloud.literal("vec3d") .argument(Vector3dArgument.of("vec3d")) .handler(ctx -> { - ctx.getSender().audience().sendMessage(text(ctx.get("vec3d").toString())); + ctx.sender().audience().sendMessage(text(ctx.get("vec3d").toString())); })); this.commandManager.command(cloud.literal("selectentities") .argument(MultipleEntitySelectorArgument.of("selector")) .handler(ctx -> { final MultipleEntitySelector selector = ctx.get("selector"); - ctx.getSender().audience().sendMessage(Component.text().append( + ctx.sender().audience().sendMessage(Component.text().append( text("Using selector: ", BLUE), text(selector.inputString()), newline(), @@ -368,12 +365,12 @@ private void registerCommands() { this.commandManager.command(cloud.literal("user") .argument(UserArgument.of("user")) .handler(ctx -> { - ctx.getSender().audience().sendMessage(text(ctx.get("user").toString())); + ctx.sender().audience().sendMessage(text(ctx.get("user").toString())); })); this.commandManager.command(cloud.literal("data") .argument(DataContainerArgument.of("data")) .handler(ctx -> { - ctx.getSender().audience().sendMessage(text(ctx.get("data").toString())); + ctx.sender().audience().sendMessage(text(ctx.get("data").toString())); })); this.commandManager.command(cloud.literal("setblock") .permission("cloud.setblock") @@ -382,20 +379,20 @@ private void registerCommands() { .handler(ctx -> { final Vector3i position = ctx.get("position"); final BlockInput input = ctx.get("block"); - final Optional location = ctx.getSender().location(); + final Optional location = ctx.sender().location(); if (location.isPresent()) { final ServerWorld world = location.get().world(); input.place(world.location(position)); - ctx.getSender().audience().sendMessage(text("set block!")); + ctx.sender().audience().sendMessage(text("set block!")); } else { - ctx.getSender().audience().sendMessage(text("no location!")); + ctx.sender().audience().sendMessage(text("no location!")); } })); this.commandManager.command(cloud.literal("blockinput") .argument(BlockInputArgument.of("block")) .handler(ctx -> { final BlockInput input = ctx.get("block"); - ctx.getSender().audience().sendMessage(text( + ctx.sender().audience().sendMessage(text( PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() .apply(RegistryTypes.BLOCK_TYPE.get(), input.blockState()) )); @@ -430,7 +427,7 @@ private void registerCommands() { final BlockInput replacement = ctx.get("replacement"); // its a player so get is fine - final ServerLocation loc = ctx.getSender().location().get(); + final ServerLocation loc = ctx.sender().location().get(); final ServerWorld world = loc.world(); final Vector3d vec = loc.position(); From 10acd0d5d1d91edf5be518e250821ae67a4a9ac6 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sat, 20 Jan 2024 19:31:48 -0700 Subject: [PATCH 50/72] Cloud number suggestions by default & check sender type in node requirement --- .../sponge/CloudSpongeCommand.java | 17 ++++++++++++----- .../sponge/SpongeParserMapper.java | 12 ++++++------ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index d05dd938..7c25cf92 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -39,6 +39,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; @@ -250,17 +251,23 @@ private static boolean canExecute(final @NonNull CommandNode node) { || node.children().stream().noneMatch(c -> c.component().required()); } + @SuppressWarnings("unchecked") private void addRequirement( final @NonNull CommandNode cloud, final @NonNull CommandTreeNode> node ) { final Permission permission = (Permission) cloud.nodeMeta() .getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()); - if (permission == Permission.empty()) { - return; - } - node.requires(cause -> - this.commandManager.testPermission(this.commandManager.senderMapper().map(cause), permission).allowed()); + final Set> senderTypes = (Set>) cloud.nodeMeta().get(CommandNode.META_KEY_SENDER_TYPES); + node.requires(cause -> { + final C c = this.commandManager.senderMapper().map(cause); + for (final Class senderType : senderTypes) { + if (senderType.isInstance(c)) { + return this.commandManager.testPermission(c, permission).allowed(); + } + } + return false; + }); } private String formatCommandForParsing(final @NonNull String arguments) { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 50d0c844..1383abea 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -127,14 +127,14 @@ private void initStandardMappers() { node.min((int) byteParser.range().minByte()); node.max((int) byteParser.range().maxByte()); return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(shortParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); node.min((int) shortParser.range().minShort()); node.max((int) shortParser.range().maxShort()); return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(integerParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.INTEGER.get().createNode(); @@ -145,7 +145,7 @@ private void initStandardMappers() { node.max(integerParser.range().maxInt()); } return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(floatParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.FLOAT.get().createNode(); @@ -156,7 +156,7 @@ private void initStandardMappers() { node.max(floatParser.range().maxFloat()); } return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(doubleParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.DOUBLE.get().createNode(); @@ -167,7 +167,7 @@ private void initStandardMappers() { node.max(doubleParser.range().maxDouble()); } return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(longParser -> { final CommandTreeNode.Range node = CommandTreeNodeTypes.LONG.get().createNode(); @@ -178,7 +178,7 @@ private void initStandardMappers() { node.max(longParser.range().maxLong()); } return node; - })); + }).cloudSuggestions(true)); this.registerMapping(new TypeToken>() { }, builder -> builder.to(booleanParser -> { return CommandTreeNodeTypes.BOOL.get().createNode(); From f73a79885248202d237486f1754511d62d6b9b66 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 10:57:19 -0700 Subject: [PATCH 51/72] Make it compile --- ...ingArgumentParser.java => NodeSource.java} | 7 +- .../sponge/SpongeCaptionRegistry.java | 39 +- .../sponge/SpongeCommandManager.java | 188 ++---- .../sponge/SpongeParserMapper.java | 14 +- .../sponge/SpongeRegistrationHandler.java | 7 +- .../sponge/annotation/specifier/Center.java | 6 +- .../sponge/argument/BlockInputArgument.java | 331 ---------- .../argument/BlockPredicateArgument.java | 215 ------ .../sponge/argument/ComponentArgument.java | 181 ----- .../argument/DataContainerArgument.java | 181 ----- .../sponge/argument/GameProfileArgument.java | 198 ------ .../GameProfileCollectionArgument.java | 212 ------ .../argument/ItemStackPredicateArgument.java | 211 ------ .../MultipleEntitySelectorArgument.java | 215 ------ .../MultiplePlayerSelectorArgument.java | 216 ------ .../argument/NamedTextColorArgument.java | 188 ------ .../sponge/argument/OperatorArgument.java | 232 ------- .../argument/ProtoItemStackArgument.java | 346 ---------- .../argument/RegistryEntryArgument.java | 617 ------------------ .../sponge/argument/ResourceKeyArgument.java | 176 ----- .../SingleEntitySelectorArgument.java | 213 ------ .../SinglePlayerSelectorArgument.java | 215 ------ .../sponge/argument/UserArgument.java | 282 -------- .../sponge/argument/Vector2dArgument.java | 250 ------- .../sponge/argument/Vector2iArgument.java | 202 ------ .../sponge/argument/Vector3dArgument.java | 252 ------- .../sponge/argument/Vector3iArgument.java | 200 ------ .../sponge/argument/VectorArgument.java | 110 ---- .../sponge/argument/WorldArgument.java | 216 ------ .../sponge/parser/BlockInputParser.java | 151 +++++ .../sponge/parser/BlockPredicateParser.java | 134 ++++ .../sponge/parser/ComponentParser.java | 80 +++ .../sponge/parser/DataContainerParser.java | 79 +++ .../parser/GameProfileCollectionParser.java | 133 ++++ .../sponge/parser/GameProfileParser.java | 118 ++++ .../parser/ItemStackPredicateParser.java | 130 ++++ .../parser/MultipleEntitySelectorParser.java | 134 ++++ .../parser/MultiplePlayerSelectorParser.java | 135 ++++ .../sponge/parser/NamedTextColorParser.java | 78 +++ .../sponge/parser/OperatorParser.java | 99 +++ .../sponge/parser/ProtoItemStackParser.java | 158 +++++ .../sponge/parser/RegistryEntryParser.java | 258 ++++++++ .../sponge/parser/ResourceKeyParser.java | 66 ++ .../{argument => parser}/ResourceKeyUtil.java | 2 +- .../parser/SingleEntitySelectorParser.java | 131 ++++ .../parser/SinglePlayerSelectorParser.java | 134 ++++ .../sponge/parser/UserParser.java | 207 ++++++ .../sponge/parser/Vector2dParser.java | 104 +++ .../sponge/parser/Vector2iParser.java | 96 +++ .../sponge/parser/Vector3dParser.java | 105 +++ .../sponge/parser/Vector3iParser.java | 94 +++ .../VectorParser.java} | 34 +- .../sponge/parser/WorldParser.java | 112 ++++ .../sponge/parser/package-info.java | 4 + .../examples/sponge/CloudExamplePlugin.java | 577 ++++++++-------- 55 files changed, 3146 insertions(+), 5927 deletions(-) rename cloud-sponge/src/main/java/cloud/commandframework/sponge/{NodeSupplyingArgumentParser.java => NodeSource.java} (87%) delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java rename cloud-sponge/src/main/java/cloud/commandframework/sponge/{argument => parser}/ResourceKeyUtil.java (98%) create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java rename cloud-sponge/src/main/java/cloud/commandframework/sponge/{argument/package-info.java => parser/VectorParser.java} (52%) create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java similarity index 87% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java index b4059958..7fbd3565 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSupplyingArgumentParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java @@ -28,12 +28,9 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNode; /** - * An {@link ArgumentParser} which also supplies a special {@link CommandTreeNode.Argument}. - * - * @param sender type - * @param value type + * Implemented by {@link ArgumentParser} which also supply a special {@link CommandTreeNode.Argument}. */ -public interface NodeSupplyingArgumentParser extends ArgumentParser { +public interface NodeSource { /** * Get the node for this parser. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index d6ef55e4..7806f837 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -23,6 +23,7 @@ // package cloud.commandframework.sponge; +import cloud.commandframework.captions.CaptionProvider; import cloud.commandframework.captions.StandardCaptionRegistry; /** @@ -36,56 +37,52 @@ public class SpongeCaptionRegistry extends StandardCaptionRegistry { * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY} */ public static final String ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY = - "No such entry '{id}' in registry '{registry}'."; + "No such entry '{id}' in registry '{registry}'."; /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME} */ public static final String ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME = - "Cannot find a user with the name '{name}'."; + "Cannot find a user with the name '{name}'."; /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID} */ public static final String ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID = - "Cannot find a user with the UUID '{uuid}'."; + "Cannot find a user with the UUID '{uuid}'."; /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT} */ public static final String ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT = - "Input '{input}' is not a valid UUID or username."; + "Input '{input}' is not a valid UUID or username."; /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED} */ public static final String ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED = - "The provided selector matched multiple game profiles, but only one is allowed."; + "The provided selector matched multiple game profiles, but only one is allowed."; protected SpongeCaptionRegistry() { super(); - this.registerMessageFactory( + this.registerProvider(CaptionProvider.constantProvider() + .putCaptions( SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, - (caption, sender) -> ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY - ); - this.registerMessageFactory( + ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY) + .putCaptions( SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME, - (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME - ); - this.registerMessageFactory( + ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME) + .putCaptions( SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID, - (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID - ); - this.registerMessageFactory( + ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID) + .putCaptions( SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT, - (caption, sender) -> ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT - ); - this.registerMessageFactory( + ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT) + .putCaptions( SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED, - (caption, sender) -> ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED - ); + ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED) + .build()); } - } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 20b9fb3c..e45bde68 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -31,36 +31,9 @@ import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.sponge.annotation.specifier.Center; -import cloud.commandframework.sponge.argument.BlockInputArgument; -import cloud.commandframework.sponge.argument.BlockPredicateArgument; -import cloud.commandframework.sponge.argument.ComponentArgument; -import cloud.commandframework.sponge.argument.DataContainerArgument; -import cloud.commandframework.sponge.argument.GameProfileArgument; -import cloud.commandframework.sponge.argument.GameProfileCollectionArgument; -import cloud.commandframework.sponge.argument.ItemStackPredicateArgument; -import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; -import cloud.commandframework.sponge.argument.MultiplePlayerSelectorArgument; -import cloud.commandframework.sponge.argument.NamedTextColorArgument; -import cloud.commandframework.sponge.argument.OperatorArgument; -import cloud.commandframework.sponge.argument.ProtoItemStackArgument; -import cloud.commandframework.sponge.argument.RegistryEntryArgument; -import cloud.commandframework.sponge.argument.ResourceKeyArgument; -import cloud.commandframework.sponge.argument.SingleEntitySelectorArgument; -import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; -import cloud.commandframework.sponge.argument.UserArgument; -import cloud.commandframework.sponge.argument.Vector2dArgument; -import cloud.commandframework.sponge.argument.Vector2iArgument; -import cloud.commandframework.sponge.argument.Vector3dArgument; -import cloud.commandframework.sponge.argument.Vector3iArgument; -import cloud.commandframework.sponge.argument.WorldArgument; -import cloud.commandframework.sponge.data.BlockPredicate; -import cloud.commandframework.sponge.data.GameProfileCollection; -import cloud.commandframework.sponge.data.ItemStackPredicate; -import cloud.commandframework.sponge.data.MultipleEntitySelector; -import cloud.commandframework.sponge.data.MultiplePlayerSelector; -import cloud.commandframework.sponge.data.ProtoItemStack; -import cloud.commandframework.sponge.data.SingleEntitySelector; -import cloud.commandframework.sponge.data.SinglePlayerSelector; +import cloud.commandframework.sponge.parser.RegistryEntryParser; +import cloud.commandframework.sponge.parser.Vector2dParser; +import cloud.commandframework.sponge.parser.Vector3dParser; import cloud.commandframework.state.RegistrationState; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; @@ -72,27 +45,38 @@ import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; -import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; -import org.spongepowered.api.command.parameter.managed.operator.Operator; -import org.spongepowered.api.data.persistence.DataContainer; -import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; -import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.registry.DefaultedRegistryType; import org.spongepowered.api.registry.Registry; import org.spongepowered.api.registry.RegistryType; import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.math.vector.Vector2d; -import org.spongepowered.math.vector.Vector2i; import org.spongepowered.math.vector.Vector3d; -import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.PluginContainer; +import static cloud.commandframework.sponge.parser.BlockInputParser.blockInputParser; +import static cloud.commandframework.sponge.parser.BlockPredicateParser.blockPredicateParser; +import static cloud.commandframework.sponge.parser.ComponentParser.componentParser; +import static cloud.commandframework.sponge.parser.DataContainerParser.dataContainerParser; +import static cloud.commandframework.sponge.parser.GameProfileCollectionParser.gameProfileCollectionParser; +import static cloud.commandframework.sponge.parser.GameProfileParser.gameProfileParser; +import static cloud.commandframework.sponge.parser.ItemStackPredicateParser.itemStackPredicateParser; +import static cloud.commandframework.sponge.parser.MultipleEntitySelectorParser.multipleEntitySelectorParser; +import static cloud.commandframework.sponge.parser.MultiplePlayerSelectorParser.multiplePlayerSelectorParser; +import static cloud.commandframework.sponge.parser.NamedTextColorParser.namedTextColorParser; +import static cloud.commandframework.sponge.parser.OperatorParser.operatorParser; +import static cloud.commandframework.sponge.parser.ProtoItemStackParser.protoItemStackParser; +import static cloud.commandframework.sponge.parser.ResourceKeyParser.resourceKeyParser; +import static cloud.commandframework.sponge.parser.SingleEntitySelectorParser.singleEntitySelectorParser; +import static cloud.commandframework.sponge.parser.SinglePlayerSelectorParser.singlePlayerSelectorParser; +import static cloud.commandframework.sponge.parser.UserParser.userParser; +import static cloud.commandframework.sponge.parser.Vector2iParser.vector2iParser; +import static cloud.commandframework.sponge.parser.Vector3iParser.vector3iParser; +import static cloud.commandframework.sponge.parser.WorldParser.worldParser; + /** * Command manager for Sponge API v8. *

      @@ -146,98 +130,38 @@ private void checkLateCreation() { } private void registerParsers() { - this.parserRegistry().registerParserSupplier( - TypeToken.get(ComponentArgument.class), - params -> new ComponentArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(NamedTextColor.class), - params -> new NamedTextColorArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(Operator.class), - params -> new OperatorArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(ServerWorld.class), - params -> new WorldArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(ProtoItemStack.class), - params -> new ProtoItemStackArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(ItemStackPredicate.class), - params -> new ItemStackPredicateArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(ResourceKey.class), - params -> new ResourceKeyArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(GameProfile.class), - params -> new GameProfileArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(GameProfileCollection.class), - params -> new GameProfileCollectionArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(BlockInputArgument.class), - params -> new BlockInputArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(BlockPredicate.class), - params -> new BlockPredicateArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(User.class), - params -> new UserArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(DataContainer.class), - params -> new DataContainerArgument.Parser<>() - ); - - // Position arguments - this.parserRegistry().registerAnnotationMapper( - Center.class, - (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector2d.class), - params -> new Vector2dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector3d.class), - params -> new Vector3dArgument.Parser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector2i.class), - params -> new Vector2iArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(Vector3i.class), - params -> new Vector3iArgument.Parser<>() - ); - - // Entity selectors - this.parserRegistry().registerParserSupplier( - TypeToken.get(SinglePlayerSelector.class), - params -> new SinglePlayerSelectorArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(MultiplePlayerSelector.class), - params -> new MultiplePlayerSelectorArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(SingleEntitySelector.class), - params -> new SingleEntitySelectorArgument.Parser<>() - ); - this.parserRegistry().registerParserSupplier( - TypeToken.get(MultipleEntitySelector.class), - params -> new MultipleEntitySelectorArgument.Parser<>() - ); + this.parserRegistry() + .registerParser(componentParser()) + .registerParser(namedTextColorParser()) + .registerParser(operatorParser()) + .registerParser(worldParser()) + .registerParser(protoItemStackParser()) + .registerParser(itemStackPredicateParser()) + .registerParser(resourceKeyParser()) + .registerParser(gameProfileParser()) + .registerParser(gameProfileCollectionParser()) + .registerParser(blockInputParser()) + .registerParser(blockPredicateParser()) + .registerParser(userParser()) + .registerParser(dataContainerParser()) + .registerAnnotationMapper( + Center.class, + (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) + ) + .registerParserSupplier( + TypeToken.get(Vector2d.class), + params -> new Vector2dParser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + ) + .registerParserSupplier( + TypeToken.get(Vector3d.class), + params -> new Vector3dParser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) + ) + .registerParser(vector2iParser()) + .registerParser(vector3iParser()) + .registerParser(singlePlayerSelectorParser()) + .registerParser(multiplePlayerSelectorParser()) + .registerParser(singleEntitySelectorParser()) + .registerParser(multipleEntitySelectorParser()); this.registerRegistryParsers(); } @@ -266,7 +190,7 @@ private void registerRegistryParsers() { this.parserRegistry().registerParserSupplier( TypeToken.get(valueType), - params -> new RegistryEntryArgument.Parser<>(defaultedRegistryType) + params -> new RegistryEntryParser<>(defaultedRegistryType) ); } } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 1383abea..ce6dd582 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -57,16 +57,6 @@ */ public final class SpongeParserMapper { - private static final Class DELEGATING_SUGGESTIONS_PROVIDER; // todo - ugly - - static { - try { - DELEGATING_SUGGESTIONS_PROVIDER = Class.forName("cloud.commandframework.arguments.DelegatingSuggestionsProvider"); - } catch (final ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - private final Map, Mapping> mappers = new HashMap<>(); SpongeParserMapper() { @@ -100,8 +90,8 @@ CommandTreeNode.Argument> mapParser(final return apply; } result = apply; - } else if (parser instanceof NodeSupplyingArgumentParser) { - result = ((NodeSupplyingArgumentParser) parser).node(); + } else if (parser instanceof NodeSource) { + result = ((NodeSource) parser).node(); } else { result = CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word(); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 76a8cc8a..658c6c7b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -38,7 +38,7 @@ import static java.util.Objects.requireNonNull; -final class SpongeRegistrationHandler implements CommandRegistrationHandler { +final class SpongeRegistrationHandler implements CommandRegistrationHandler { private SpongeCommandManager commandManager; private final Set> registeredCommands = new HashSet<>(); @@ -74,10 +74,9 @@ void initialize(final @NonNull SpongeCommandManager commandManager) { ); } - @SuppressWarnings("unchecked") @Override - public boolean registerCommand(cloud.commandframework.@NonNull Command command) { - this.registeredCommands.add((cloud.commandframework.Command) command); + public boolean registerCommand(cloud.commandframework.@NonNull Command command) { + this.registeredCommands.add(command); return true; } } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java index 01338df3..5254baf7 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java @@ -23,15 +23,15 @@ // package cloud.commandframework.sponge.annotation.specifier; -import cloud.commandframework.sponge.argument.Vector2dArgument; -import cloud.commandframework.sponge.argument.Vector3dArgument; +import cloud.commandframework.sponge.parser.Vector2dParser; +import cloud.commandframework.sponge.parser.Vector3dParser; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Annotation used to enable coordinate centering for {@link Vector3dArgument} and {@link Vector2dArgument}. + * Annotation used to enable coordinate centering for {@link Vector3dParser} and {@link Vector2dParser}. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java deleted file mode 100644 index d177fb73..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockInputArgument.java +++ /dev/null @@ -1,331 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.data.BlockInput; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.arguments.blocks.BlockStateArgument; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.block.BlockState; -import org.spongepowered.api.block.BlockType; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.data.persistence.DataContainer; -import org.spongepowered.api.registry.DefaultedRegistryReference; -import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.world.BlockChangeFlag; -import org.spongepowered.api.world.BlockChangeFlags; -import org.spongepowered.api.world.schematic.PaletteTypes; -import org.spongepowered.api.world.server.ServerLocation; -import org.spongepowered.common.data.persistence.NBTTranslator; -import org.spongepowered.common.util.VecHelper; -import org.spongepowered.common.world.SpongeBlockChangeFlag; - -/** - * An argument for parsing {@link BlockInput} from a {@link BlockState} - * and optional extra NBT data. - * - *

      Example input strings:

      - *
        - *
      • {@code stone}
      • - *
      • {@code minecraft:stone}
      • - *
      • {@code andesite_stairs[waterlogged=true,facing=east]}
      • - *
      - * - * @param sender type - */ -public final class BlockInputArgument extends CommandArgument { - - private BlockInputArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - BlockInput.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link BlockInputArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link BlockInputArgument} - */ - public static @NonNull BlockInputArgument of(final @NonNull String name) { - return BlockInputArgument.builder(name).build(); - } - - /** - * Create a new optional {@link BlockInputArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link BlockInputArgument} - */ - public static @NonNull BlockInputArgument optional(final @NonNull String name) { - return BlockInputArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link BlockInputArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link BlockInputArgument} - */ - public static @NonNull BlockInputArgument optional( - final @NonNull String name, - final @NonNull BlockState defaultValue - ) { - return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link BlockInputArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link BlockInputArgument} - */ - public static @NonNull BlockInputArgument optional( - final @NonNull String name, - final @NonNull BlockType defaultValue - ) { - return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link BlockInputArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link BlockInputArgument} - */ - public static @NonNull BlockInputArgument optional( - final @NonNull String name, - final @NonNull DefaultedRegistryReference defaultValue - ) { - return BlockInputArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link BlockState BlockStates}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(BlockStateArgument.block()) - .map((ctx, blockInput) -> ArgumentParseResult.success(new BlockInputImpl(blockInput))); - - @Override - public @NonNull ArgumentParseResult parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.BLOCK_STATE.get().createNode(); - } - - private static final class BlockInputImpl implements BlockInput { - - // todo: use accessor - private static final Field COMPOUND_TAG_FIELD = - Arrays.stream(net.minecraft.commands.arguments.blocks.BlockInput.class.getDeclaredFields()) - .filter(f -> f.getType().equals(CompoundTag.class)) - .findFirst() - .orElseThrow(IllegalStateException::new); - - static { - COMPOUND_TAG_FIELD.setAccessible(true); - } - - private final net.minecraft.commands.arguments.blocks.BlockInput blockInput; - private final @Nullable DataContainer extraData; - - BlockInputImpl(final net.minecraft.commands.arguments.blocks.@NonNull BlockInput blockInput) { - this.blockInput = blockInput; - try { - final CompoundTag tag = (CompoundTag) COMPOUND_TAG_FIELD.get(blockInput); - this.extraData = tag == null ? null : NBTTranslator.INSTANCE.translate(tag); - } catch (final IllegalAccessException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public @NonNull BlockState blockState() { - return (BlockState) this.blockInput.getState(); - } - - @Override - public @Nullable DataContainer extraData() { - return this.extraData; - } - - @Override - public boolean place(final @NonNull ServerLocation location) { - return this.place(location, BlockChangeFlags.DEFAULT_PLACEMENT); - } - - @Override - public boolean place(final @NonNull ServerLocation location, final @NonNull BlockChangeFlag flag) { - return this.blockInput.place( - (ServerLevel) location.world(), - VecHelper.toBlockPos(location.position()), - ((SpongeBlockChangeFlag) flag).getRawFlag() - ); - } - - } - - } - - /** - * Builder for {@link BlockInputArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(BlockInput.class, name); - } - - @Override - public @NonNull BlockInputArgument build() { - return new BlockInputArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultState default {@link BlockState} - * @param defaultExtraData default extra data - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault( - final @NonNull BlockState defaultState, - final @Nullable DataContainer defaultExtraData - ) { - final String value = PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() - .apply(RegistryTypes.BLOCK_TYPE.get(), defaultState) - + (defaultExtraData == null ? "" : NBTTranslator.INSTANCE.translate(defaultExtraData).toString()); - return this.asOptionalWithDefault(value); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull BlockState defaultValue) { - return this.asOptionalWithDefault(defaultValue, null); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull BlockType defaultValue) { - return this.asOptionalWithDefault(defaultValue.defaultState()); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { - return this.asOptionalWithDefault(defaultValue.get()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java deleted file mode 100644 index 597fe023..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/BlockPredicateArgument.java +++ /dev/null @@ -1,215 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.BlockPredicate; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.state.pattern.BlockInWorld; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.world.server.ServerLocation; -import org.spongepowered.common.util.VecHelper; - -/** - * An argument for parsing {@link BlockPredicate BlockPredicates}. - * - * @param sender type - */ -public final class BlockPredicateArgument extends CommandArgument { - - private BlockPredicateArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - BlockPredicate.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link BlockPredicateArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link BlockPredicateArgument} - */ - public static @NonNull BlockPredicateArgument of(final @NonNull String name) { - return BlockPredicateArgument.builder(name).build(); - } - - /** - * Create a new optional {@link BlockPredicateArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link BlockPredicateArgument} - */ - public static @NonNull BlockPredicateArgument optional(final @NonNull String name) { - return BlockPredicateArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link BlockPredicate}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser( - net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() - ).map((ctx, result) -> { - final CommandSourceStack commandSourceStack = - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); - try { - return ArgumentParseResult.success( - new BlockPredicateImpl(result.create(commandSourceStack.getLevel().getTagManager())) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull BlockPredicate> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.BLOCK_PREDICATE.get().createNode(); - } - - private static final class BlockPredicateImpl implements BlockPredicate { - - private final Predicate predicate; - - BlockPredicateImpl(final @NonNull Predicate predicate) { - this.predicate = predicate; - } - - private boolean testImpl(final @NonNull ServerLocation location, final boolean loadChunks) { - return this.predicate.test(new BlockInWorld( - (ServerLevel) location.world(), - VecHelper.toBlockPos(location.position()), - loadChunks - )); - } - - @Override - public boolean test(final @NonNull ServerLocation location) { - return this.testImpl(location, false); - } - - @Override - public @NonNull BlockPredicate loadChunks() { - return new BlockPredicate() { - @Override - public @NonNull BlockPredicate loadChunks() { - return this; - } - - @Override - public boolean test(final @NonNull ServerLocation location) { - return BlockPredicateImpl.this.testImpl(location, true); - } - }; - } - - } - - } - - /** - * Builder for {@link BlockPredicateArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(BlockPredicate.class, name); - } - - @Override - public @NonNull BlockPredicateArgument build() { - return new BlockPredicateArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java deleted file mode 100644 index e7f75371..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ComponentArgument.java +++ /dev/null @@ -1,181 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.ComponentLike; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.common.adventure.SpongeAdventure; - -/** - * An argument for parsing {@link Component Components} from json formatted text. - * - * @param sender type - */ -public final class ComponentArgument extends CommandArgument { - - private ComponentArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - Component.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link ComponentArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ComponentArgument} - */ - public static @NonNull ComponentArgument of(final @NonNull String name) { - return ComponentArgument.builder(name).build(); - } - - /** - * Create a new optional {@link ComponentArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ComponentArgument} - */ - public static @NonNull ComponentArgument optional(final @NonNull String name) { - return ComponentArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link ComponentArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ComponentArgument} - */ - public static @NonNull ComponentArgument optional( - final @NonNull String name, - final @NonNull ComponentLike defaultValue - ) { - return ComponentArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link Component Components} from json formatted text. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser( - net.minecraft.commands.arguments.ComponentArgument.textComponent() - ).map((ctx, component) -> - ArgumentParseResult.success(SpongeAdventure.asAdventure(component))); - - @Override - public @NonNull ArgumentParseResult<@NonNull Component> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.COMPONENT.get().createNode(); - } - - } - - /** - * Builder for {@link ComponentArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(Component.class, name); - } - - @Override - public @NonNull ComponentArgument build() { - return new ComponentArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ComponentLike defaultValue) { - return this.asOptionalWithDefault(GsonComponentSerializer.gson().serialize(defaultValue.asComponent())); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java deleted file mode 100644 index fcee3574..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/DataContainerArgument.java +++ /dev/null @@ -1,181 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.arguments.CompoundTagArgument; -import net.minecraft.nbt.CompoundTag; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.data.persistence.DataContainer; -import org.spongepowered.common.data.persistence.NBTTranslator; - -/** - * Argument for parsing {@link DataContainer DataContainers} from - *
      SNBT strings. - * - * @param sender type - */ -public final class DataContainerArgument extends CommandArgument { - - private DataContainerArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - DataContainer.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link DataContainerArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link DataContainerArgument} - */ - public static @NonNull DataContainerArgument of(final @NonNull String name) { - return DataContainerArgument.builder(name).build(); - } - - /** - * Create a new optional {@link DataContainerArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link DataContainerArgument} - */ - public static @NonNull DataContainerArgument optional(final @NonNull String name) { - return DataContainerArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link DataContainerArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link DataContainerArgument} - */ - public static @NonNull DataContainerArgument optional( - final @NonNull String name, - final @NonNull DataContainer defaultValue - ) { - return DataContainerArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link DataContainer DataContainers} from SNBT. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(CompoundTagArgument.compoundTag()) - .map((ctx, compoundTag) -> - ArgumentParseResult.success(NBTTranslator.INSTANCE.translate(compoundTag))); - - @Override - public @NonNull ArgumentParseResult<@NonNull DataContainer> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.NBT_COMPOUND_TAG.get().createNode(); - } - - } - - /** - * Builder for {@link DataContainerArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(DataContainer.class, name); - } - - @Override - public @NonNull DataContainerArgument build() { - return new DataContainerArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull DataContainer defaultValue) { - return this.asOptionalWithDefault(NBTTranslator.INSTANCE.translate(defaultValue).toString()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java deleted file mode 100644 index 97a8f613..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileArgument.java +++ /dev/null @@ -1,198 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.exceptions.parsing.ParserException; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCaptionKeys; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.profile.GameProfile; -import org.spongepowered.common.profile.SpongeGameProfile; - -/** - * Argument for parsing a single {@link GameProfile} from a {@link Selector}. - * - * @param sender type - */ -public final class GameProfileArgument extends CommandArgument { - - private GameProfileArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - GameProfile.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link GameProfileArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link GameProfileArgument} - */ - public static @NonNull GameProfileArgument of(final @NonNull String name) { - return GameProfileArgument.builder(name).build(); - } - - /** - * Create a new optional {@link GameProfileArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link GameProfileArgument} - */ - public static @NonNull GameProfileArgument optional(final @NonNull String name) { - return GameProfileArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Create a new parser for a single {@link GameProfile}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser( - net.minecraft.commands.arguments.GameProfileArgument.gameProfile() - ).map((ctx, argumentResult) -> { - final Collection profiles; - try { - profiles = argumentResult.getNames( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - if (profiles.size() > 1) { - return ArgumentParseResult.failure(new TooManyGameProfilesSelectedException(ctx)); - } - final GameProfile profile = SpongeGameProfile.of(profiles.iterator().next()); - return ArgumentParseResult.success(profile); - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull GameProfile> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); - } - - } - - /** - * Builder for {@link GameProfileArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(GameProfile.class, name); - } - - @Override - public @NonNull GameProfileArgument build() { - return new GameProfileArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - /** - * Exception thrown when too many game profiles are selected. - */ - private static final class TooManyGameProfilesSelectedException extends ParserException { - - private static final long serialVersionUID = -2931411139985042222L; - - TooManyGameProfilesSelectedException(final @NonNull CommandContext context) { - super( - Parser.class, - context, - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java deleted file mode 100644 index f841e9ec..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/GameProfileCollectionArgument.java +++ /dev/null @@ -1,212 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.GameProfileCollection; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.AbstractCollection; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import net.minecraft.commands.CommandSourceStack; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.framework.qual.DefaultQualifier; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.profile.GameProfile; -import org.spongepowered.common.profile.SpongeGameProfile; - -/** - * Argument for parsing a {@link Collection} of {@link GameProfile GameProfiles} from a - * {@link Selector}. A successfully parsed result will contain at least one element. - * - * @param sender type - */ -public final class GameProfileCollectionArgument extends CommandArgument { - - private GameProfileCollectionArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - GameProfileCollection.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link GameProfileArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link GameProfileArgument} - */ - public static @NonNull GameProfileCollectionArgument of(final @NonNull String name) { - return GameProfileCollectionArgument.builder(name).build(); - } - - /** - * Create a new optional {@link GameProfileArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link GameProfileArgument} - */ - public static @NonNull GameProfileCollectionArgument optional(final @NonNull String name) { - return GameProfileCollectionArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for a {@link Collection} of {@link GameProfile GameProfiles}. A successfully parsed result will - * contain at least one element. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser( - net.minecraft.commands.arguments.GameProfileArgument.gameProfile() - ).map((ctx, argumentResult) -> { - final Collection profiles; - try { - profiles = argumentResult.getNames( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - final List result = profiles.stream() - .map(SpongeGameProfile::of).collect(Collectors.toList()); - return ArgumentParseResult.success(new GameProfileCollectionImpl(Collections.unmodifiableCollection(result))); - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull GameProfileCollection> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); - } - - } - - /** - * Builder for {@link GameProfileCollectionArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(GameProfileCollection.class, name); - } - - @Override - public @NonNull GameProfileCollectionArgument build() { - return new GameProfileCollectionArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - @DefaultQualifier(NonNull.class) - private static final class GameProfileCollectionImpl extends AbstractCollection - implements GameProfileCollection { - - private final Collection backing; - - private GameProfileCollectionImpl(final Collection backing) { - this.backing = backing; - } - - @Override - public int size() { - return this.backing.size(); - } - - @Override - public Iterator iterator() { - return this.backing.iterator(); - } - - @Override - public boolean add(final GameProfile gameProfile) { - return this.backing.add(gameProfile); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java deleted file mode 100644 index 0e108094..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ItemStackPredicateArgument.java +++ /dev/null @@ -1,211 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.ItemStackPredicate; -import com.mojang.brigadier.context.StringRange; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.Collections; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.item.ItemPredicateArgument; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.item.inventory.ItemStack; - -/** - * An argument for parsing {@link ItemStackPredicate ItemStackPredicates}. - * - * @param sender type - */ -public final class ItemStackPredicateArgument extends CommandArgument { - - private ItemStackPredicateArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - ItemStackPredicate.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link ItemStackPredicateArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ItemStackPredicateArgument} - */ - public static @NonNull ItemStackPredicateArgument of(final @NonNull String name) { - return ItemStackPredicateArgument.builder(name).build(); - } - - /** - * Create a new optional {@link ItemStackPredicateArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ItemStackPredicateArgument} - */ - public static @NonNull ItemStackPredicateArgument optional(final @NonNull String name) { - return ItemStackPredicateArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link ItemStackPredicate}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser( - ItemPredicateArgument.itemPredicate() - ).map((ctx, result) -> { - final CommandSourceStack commandSourceStack = - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); - try { - final com.mojang.brigadier.context.CommandContext dummyContext = - createDummyContext(ctx, commandSourceStack); - return ArgumentParseResult.success(new ItemStackPredicateImpl(result.create(dummyContext))); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull ItemStackPredicate> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ITEM_PREDICATE.get().createNode(); - } - - private static final class ItemStackPredicateImpl implements ItemStackPredicate { - - private final Predicate predicate; - - ItemStackPredicateImpl(final @NonNull Predicate predicate) { - this.predicate = predicate; - } - - @SuppressWarnings("ConstantConditions") - @Override - public boolean test(final @NonNull ItemStack itemStack) { - return this.predicate.test((net.minecraft.world.item.ItemStack) (Object) itemStack); - } - - } - - private static com.mojang.brigadier.context.@NonNull CommandContext createDummyContext( - final @NonNull CommandContext ctx, - final @NonNull CommandSourceStack commandSourceStack - ) { - return new com.mojang.brigadier.context.CommandContext<>( - commandSourceStack, - ctx.getRawInputJoined(), - Collections.emptyMap(), - null, - null, - Collections.emptyList(), - StringRange.at(0), - null, - null, - false - ); - } - - } - - /** - * Builder for {@link ItemStackPredicateArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(ItemStackPredicate.class, name); - } - - @Override - public @NonNull ItemStackPredicateArgument build() { - return new ItemStackPredicateArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java deleted file mode 100644 index 5e745ea2..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultipleEntitySelectorArgument.java +++ /dev/null @@ -1,215 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.MultipleEntitySelector; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.selector.EntitySelector; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.Entity; - -/** - * Argument for selecting one or more {@link Entity Entities} using a {@link Selector}. - * - * @param sender type - */ -public final class MultipleEntitySelectorArgument extends CommandArgument { - - private MultipleEntitySelectorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - MultipleEntitySelector.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link MultipleEntitySelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link MultipleEntitySelectorArgument} - */ - public static @NonNull MultipleEntitySelectorArgument of(final @NonNull String name) { - return MultipleEntitySelectorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link MultipleEntitySelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link MultipleEntitySelectorArgument} - */ - public static @NonNull MultipleEntitySelectorArgument optional(final @NonNull String name) { - return MultipleEntitySelectorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link MultipleEntitySelector}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entities()); - - @Override - public @NonNull ArgumentParseResult<@NonNull MultipleEntitySelector> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String originalInput = String.join(" ", inputQueue); - final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); - if (result.getFailure().isPresent()) { - return ArgumentParseResult.failure(result.getFailure().get()); - } - final String consumedInput = String.join(" ", inputQueue); - final EntitySelector parsed = result.getParsedValue().get(); - final List entities; - try { - entities = parsed.findEntities( - ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) - ).stream().map(e -> (Entity) e).collect(Collectors.toList()); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - final int consumedChars = originalInput.length() - consumedInput.length(); - final String input = originalInput.substring(0, consumedChars); - return ArgumentParseResult.success(new MultipleEntitySelectorImpl((Selector) parsed, input, entities)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.nativeParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ENTITY.get().createNode(); - } - - } - - /** - * Builder for {@link MultipleEntitySelectorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(MultipleEntitySelector.class, name); - } - - @Override - public @NonNull MultipleEntitySelectorArgument build() { - return new MultipleEntitySelectorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - private static final class MultipleEntitySelectorImpl implements MultipleEntitySelector { - - private final Selector selector; - private final String inputString; - private final Collection result; - - private MultipleEntitySelectorImpl( - final Selector selector, - final String inputString, - final Collection result - ) { - this.selector = selector; - this.inputString = inputString; - this.result = result; - } - - @Override - public @NonNull Selector selector() { - return this.selector; - } - - @Override - public @NonNull String inputString() { - return this.inputString; - } - - @Override - public @NonNull Collection get() { - return this.result; - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java deleted file mode 100644 index aefd158f..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/MultiplePlayerSelectorArgument.java +++ /dev/null @@ -1,216 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.MultiplePlayerSelector; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.Collection; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.selector.EntitySelector; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.server.ServerPlayer; - -/** - * Argument for selecting one or more {@link Player Players} using a {@link Selector}. - * - * @param sender type - */ -public final class MultiplePlayerSelectorArgument extends CommandArgument { - - private MultiplePlayerSelectorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - MultiplePlayerSelector.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link MultiplePlayerSelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a bew {@link MultiplePlayerSelectorArgument} - */ - public static @NonNull MultiplePlayerSelectorArgument of(final @NonNull String name) { - return MultiplePlayerSelectorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link MultiplePlayerSelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a bew {@link MultiplePlayerSelectorArgument} - */ - public static @NonNull MultiplePlayerSelectorArgument optional(final @NonNull String name) { - return MultiplePlayerSelectorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link MultiplePlayerSelector}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.players()); - - @Override - public @NonNull ArgumentParseResult<@NonNull MultiplePlayerSelector> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String originalInput = String.join(" ", inputQueue); - final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); - if (result.getFailure().isPresent()) { - return ArgumentParseResult.failure(result.getFailure().get()); - } - final String consumedInput = String.join(" ", inputQueue); - final EntitySelector parsed = result.getParsedValue().get(); - final List players; - try { - players = parsed.findPlayers( - ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) - ).stream().map(p -> (ServerPlayer) p).collect(Collectors.toList()); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - final int consumedChars = originalInput.length() - consumedInput.length(); - final String input = originalInput.substring(0, consumedChars); - return ArgumentParseResult.success(new MultiplePlayerSelectorImpl((Selector) parsed, input, players)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.nativeParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly(); - } - - } - - /** - * Builder for {@link MultiplePlayerSelectorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(MultiplePlayerSelector.class, name); - } - - @Override - public @NonNull MultiplePlayerSelectorArgument build() { - return new MultiplePlayerSelectorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - private static final class MultiplePlayerSelectorImpl implements MultiplePlayerSelector { - - private final Selector selector; - private final String inputString; - private final Collection result; - - private MultiplePlayerSelectorImpl( - final Selector selector, - final String inputString, - final Collection result - ) { - this.selector = selector; - this.inputString = inputString; - this.result = result; - } - - @Override - public @NonNull Selector selector() { - return this.selector; - } - - @Override - public @NonNull String inputString() { - return this.inputString; - } - - @Override - public @NonNull Collection get() { - return this.result; - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java deleted file mode 100644 index 9d11581d..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/NamedTextColorArgument.java +++ /dev/null @@ -1,188 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.Queue; -import java.util.function.BiFunction; -import net.kyori.adventure.text.format.NamedTextColor; -import net.minecraft.commands.arguments.ColorArgument; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; - -/** - * An argument for parsing {@link NamedTextColor NamedTextColors}. - * - * @param sender type - */ -public final class NamedTextColorArgument extends CommandArgument { - - private NamedTextColorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - NamedTextColor.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link NamedTextColorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link NamedTextColorArgument} - */ - public static @NonNull NamedTextColorArgument of(final @NonNull String name) { - return NamedTextColorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link NamedTextColorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link NamedTextColorArgument} - */ - public static @NonNull NamedTextColorArgument optional(final @NonNull String name) { - return NamedTextColorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link NamedTextColorArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link NamedTextColorArgument} - */ - public static @NonNull NamedTextColorArgument optional( - final @NonNull String name, - final @NonNull NamedTextColor defaultValue - ) { - return NamedTextColorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link NamedTextColor}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - @Override - public @NonNull ArgumentParseResult<@NonNull NamedTextColor> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String input = inputQueue.peek().toLowerCase(Locale.ROOT); - final NamedTextColor color = NamedTextColor.NAMES.value(input); - if (color != null) { - inputQueue.remove(); - return ArgumentParseResult.success(color); - } - return ArgumentParseResult.failure(ColorArgument.ERROR_INVALID_VALUE.create(input)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return new ArrayList<>(NamedTextColor.NAMES.keys()); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.COLOR.get().createNode(); - } - - } - - /** - * Builder for {@link NamedTextColorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(NamedTextColor.class, name); - } - - @Override - public @NonNull NamedTextColorArgument build() { - return new NamedTextColorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull NamedTextColor defaultValue) { - return this.asOptionalWithDefault(Objects.requireNonNull(NamedTextColor.NAMES.key(defaultValue))); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java deleted file mode 100644 index c50a6f50..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/OperatorArgument.java +++ /dev/null @@ -1,232 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.parameter.managed.operator.Operator; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.registry.DefaultedRegistryReference; -import org.spongepowered.api.registry.RegistryTypes; - -/** - * An argument for parsing {@link Operator Operators}. - * - * @param sender type - */ -public final class OperatorArgument extends CommandArgument { - - private OperatorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - Operator.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link OperatorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link OperatorArgument} - */ - public static @NonNull OperatorArgument of(final @NonNull String name) { - return OperatorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link OperatorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link OperatorArgument} - */ - public static @NonNull OperatorArgument optional(final @NonNull String name) { - return OperatorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link OperatorArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link OperatorArgument} - */ - public static @NonNull OperatorArgument optional(final @NonNull String name, final @NonNull Operator defaultValue) { - return OperatorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link OperatorArgument} with the specified default value. - * - * @param name argument name - * @param sender type - * @param defaultValue default value - * @return a new {@link OperatorArgument} - */ - public static @NonNull OperatorArgument optional( - final @NonNull String name, - final @NonNull DefaultedRegistryReference defaultValue - ) { - return OperatorArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Argument parser for {@link Operator Operators}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private static final SimpleCommandExceptionType ERROR_INVALID_OPERATION; - - static { - try { - // todo: fix in a better way - final Class spongeAccessor = - Class.forName("org.spongepowered.common.accessor.commands.arguments.OperationArgumentAccessor"); - final Method get = spongeAccessor.getDeclaredMethod("accessor$ERROR_INVALID_OPERATION"); - get.setAccessible(true); - ERROR_INVALID_OPERATION = (SimpleCommandExceptionType) get.invoke(null); - } catch (final ReflectiveOperationException ex) { - throw new RuntimeException("Couldn't access ERROR_INVALID_OPERATION command exception type.", ex); - } - } - - @Override - public @NonNull ArgumentParseResult<@NonNull Operator> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String input = inputQueue.peek(); - final Optional operator = RegistryTypes.OPERATOR.get().stream() - .filter(op -> op.asString().equals(input)) - .findFirst(); - if (!operator.isPresent()) { - return ArgumentParseResult.failure(ERROR_INVALID_OPERATION.create()); - } - inputQueue.remove(); - return ArgumentParseResult.success(operator.get()); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return RegistryTypes.OPERATOR.get().stream() - .map(Operator::asString) - .collect(Collectors.toList()); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.OPERATION.get().createNode(); - } - - } - - /** - * Builder for {@link OperatorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(Operator.class, name); - } - - @Override - public @NonNull OperatorArgument build() { - return new OperatorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull Operator defaultValue) { - return this.asOptionalWithDefault(defaultValue.asString()); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { - return this.asOptionalWithDefault(defaultValue.get().asString()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java deleted file mode 100644 index 2f7f1449..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ProtoItemStackArgument.java +++ /dev/null @@ -1,346 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.data.ProtoItemStack; -import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.kyori.adventure.util.ComponentMessageThrowable; -import net.minecraft.commands.arguments.item.ItemArgument; -import net.minecraft.commands.arguments.item.ItemInput; -import net.minecraft.nbt.CompoundTag; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.data.persistence.DataContainer; -import org.spongepowered.api.item.ItemType; -import org.spongepowered.api.item.inventory.ItemStack; -import org.spongepowered.api.item.inventory.ItemStackSnapshot; -import org.spongepowered.api.registry.DefaultedRegistryReference; -import org.spongepowered.common.data.persistence.NBTTranslator; - -/** - * An argument for parsing {@link ProtoItemStack ProtoItemStacks} from an {@link ItemType} identifier - * and optional NBT data. - * - *

      Example input strings:

      - *
        - *
      • {@code apple}
      • - *
      • {@code minecraft:apple}
      • - *
      • {@code diamond_sword{Enchantments:[{id:sharpness,lvl:5}]}}
      • - *
      - * - * @param sender type - */ -public final class ProtoItemStackArgument extends CommandArgument { - - private ProtoItemStackArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - ProtoItemStack.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link ProtoItemStackArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument of(final @NonNull String name) { - return ProtoItemStackArgument.builder(name).build(); - } - - /** - * Create a new optional {@link ProtoItemStackArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument optional(final @NonNull String name) { - return ProtoItemStackArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link ProtoItemStackArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument optional( - final @NonNull String name, - final @NonNull ItemStackSnapshot defaultValue - ) { - return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link ProtoItemStackArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument optional( - final @NonNull String name, - final @NonNull ItemStack defaultValue - ) { - return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link ProtoItemStackArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument optional( - final @NonNull String name, - final @NonNull ItemType defaultValue - ) { - return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link ProtoItemStackArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ProtoItemStackArgument} - */ - public static @NonNull ProtoItemStackArgument optional( - final @NonNull String name, - final @NonNull DefaultedRegistryReference defaultValue - ) { - return ProtoItemStackArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link ItemStackSnapshot ItemStackSnapshots} from an {@link ItemType} identifier and - * optional NBT data. The stack size of the resulting snapshot will always be {@code 1}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(ItemArgument.item()) - .map((ctx, itemInput) -> ArgumentParseResult.success(new ProtoItemStackImpl(itemInput))); - - @Override - public @NonNull ArgumentParseResult<@NonNull ProtoItemStack> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ITEM_STACK.get().createNode(); - } - - private static final class ProtoItemStackImpl implements ProtoItemStack { - - // todo: use accessor - private static final Field COMPOUND_TAG_FIELD = - Arrays.stream(ItemInput.class.getDeclaredFields()) - .filter(f -> f.getType().equals(CompoundTag.class)) - .findFirst() - .orElseThrow(IllegalStateException::new); - - static { - COMPOUND_TAG_FIELD.setAccessible(true); - } - - private final ItemInput itemInput; - private final @Nullable DataContainer extraData; - - ProtoItemStackImpl(final @NonNull ItemInput itemInput) { - this.itemInput = itemInput; - try { - final CompoundTag tag = (CompoundTag) COMPOUND_TAG_FIELD.get(itemInput); - this.extraData = tag == null ? null : NBTTranslator.INSTANCE.translate(tag); - } catch (final IllegalAccessException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public @NonNull ItemType itemType() { - return (ItemType) this.itemInput.getItem(); - } - - @Override - public @Nullable DataContainer extraData() { - return this.extraData; - } - - @SuppressWarnings("ConstantConditions") - @Override - public @NonNull ItemStack createItemStack( - final int stackSize, - final boolean respectMaximumStackSize - ) throws ComponentMessageRuntimeException { - try { - return (ItemStack) (Object) this.itemInput.createItemStack(stackSize, respectMaximumStackSize); - } catch (final CommandSyntaxException ex) { - throw new ComponentMessageRuntimeException(ComponentMessageThrowable.getMessage(ex), ex); - } - } - - @Override - public @NonNull ItemStackSnapshot createItemStackSnapshot( - final int stackSize, - final boolean respectMaximumStackSize - ) throws ComponentMessageRuntimeException { - return this.createItemStack(stackSize, respectMaximumStackSize).createSnapshot(); - } - - } - - } - - /** - * Builder for {@link ProtoItemStackArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(ProtoItemStack.class, name); - } - - @Override - public @NonNull ProtoItemStackArgument build() { - return new ProtoItemStackArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ItemType defaultValue) { - return this.asOptionalWithDefault(ItemStack.of(defaultValue)); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull DefaultedRegistryReference defaultValue) { - return this.asOptionalWithDefault(defaultValue.get()); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ItemStackSnapshot defaultValue) { - return this.asOptionalWithDefault(defaultValue.createStack()); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - @SuppressWarnings("ConstantConditions") - public @NonNull Builder asOptionalWithDefault(final @NonNull ItemStack defaultValue) { - final net.minecraft.world.item.ItemStack stack = (net.minecraft.world.item.ItemStack) (Object) defaultValue; - return this.asOptionalWithDefault(new ItemInput(stack.getItem(), stack.getTag()).serialize()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java deleted file mode 100644 index 2161c90a..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/RegistryEntryArgument.java +++ /dev/null @@ -1,617 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.captions.CaptionVariable; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.exceptions.parsing.ParserException; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCaptionKeys; -import io.leangen.geantyref.TypeToken; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.command.registrar.tree.CommandCompletionProviders; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.registry.DefaultedRegistryType; -import org.spongepowered.api.registry.Registry; -import org.spongepowered.api.registry.RegistryEntry; -import org.spongepowered.api.registry.RegistryHolder; -import org.spongepowered.api.registry.RegistryReference; -import org.spongepowered.api.registry.RegistryType; -import org.spongepowered.api.registry.RegistryTypes; - -/** - * An argument for retrieving values from any of Sponge's {@link Registry Registries}. - * - * @param sender type - * @param value type - */ -public final class RegistryEntryArgument extends CommandArgument { - - private RegistryEntryArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(holderSupplier, registryType), - defaultValue, - valueType, - suggestionsProvider, - defaultDescription - ); - } - - // Start DefaultedRegistryType methods - - /** - * Create a new required {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument of( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return RegistryEntryArgument.builder(name, valueType, registryType).build(); - } - - /** - * Create a new required {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument of( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return of(name, TypeToken.get(valueType), registryType); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return RegistryEntryArgument.builder(name, valueType, registryType).asOptional().build(); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return optional(name, TypeToken.get(valueType), registryType); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}, - * with the specified default value. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param defaultValue default value - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull DefaultedRegistryType registryType, - final @NonNull RegistryReference defaultValue - ) { - return RegistryEntryArgument.builder(name, valueType, registryType) - .asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link DefaultedRegistryType}, - * with the specified default value. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param defaultValue default value - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull DefaultedRegistryType registryType, - final @NonNull RegistryReference defaultValue - ) { - return optional(name, TypeToken.get(valueType), registryType, defaultValue); - } - - /** - * Create a new {@link Builder} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return new Builder<>(name, valueType, ctx -> registryType.defaultHolder().get(), registryType); - } - - /** - * Create a new {@link Builder} for a {@link DefaultedRegistryType}. - * - * @param name argument name - * @param valueType value type - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull DefaultedRegistryType registryType - ) { - return builder(name, TypeToken.get(valueType), registryType); - } - - // End DefaultedRegistryType methods - - // Start RegistryType methods - - /** - * Create a new required {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #of(String, TypeToken, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument of( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return RegistryEntryArgument.builder(name, valueType, holderSupplier, registryType).build(); - } - - /** - * Create a new required {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #of(String, Class, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument of( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return of(name, TypeToken.get(valueType), holderSupplier, registryType); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #optional(String, TypeToken, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return builder(name, valueType, holderSupplier, registryType).asOptional().build(); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #optional(String, Class, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return optional(name, TypeToken.get(valueType), holderSupplier, registryType); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function and default value. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #optional(String, Class, DefaultedRegistryType, RegistryReference)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param defaultValue default value - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType, - final @NonNull RegistryReference defaultValue - ) { - return optional(name, TypeToken.get(valueType), holderSupplier, registryType, defaultValue); - } - - /** - * Create a new optional {@link RegistryEntryArgument} for a {@link RegistryType} - * using the specified {@link RegistryHolder} function and default value. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #optional(String, TypeToken, DefaultedRegistryType, RegistryReference)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param defaultValue default value - * @param sender type - * @param value type - * @return a new {@link RegistryEntryArgument} - */ - public static @NonNull RegistryEntryArgument optional( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType, - final @NonNull RegistryReference defaultValue - ) { - return builder(name, valueType, holderSupplier, registryType).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder} using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #builder(String, TypeToken, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return new Builder<>(name, valueType, holderSupplier, registryType); - } - - /** - * Create a new {@link Builder} using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #builder(String, Class, DefaultedRegistryType)}.

      - * - * @param name argument name - * @param valueType value type - * @param holderSupplier registry holder function - * @param registryType registry type - * @param sender type - * @param value type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder( - final @NonNull String name, - final @NonNull Class valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - return builder(name, TypeToken.get(valueType), holderSupplier, registryType); - } - - // End RegistryType methods - - /** - * An argument parser for values in a {@link Registry}. - * - * @param sender type - * @param value type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final Function, RegistryHolder> holderSupplier; - private final RegistryType registryType; - - /** - * Create a new {@link Parser} using the specified {@link RegistryHolder} function. - * - *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, - * it is suggested to instead use {@link #Parser(DefaultedRegistryType)}.

      - * - * @param holderSupplier registry holder function - * @param registryType registry type - */ - public Parser( - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - this.holderSupplier = holderSupplier; - this.registryType = registryType; - } - - /** - * Create a new {@link Parser}. - * - * @param registryType defaulted registry type - */ - public Parser(final @NonNull DefaultedRegistryType registryType) { - this(ctx -> registryType.defaultHolder().get(), registryType); - } - - private Registry registry(final @NonNull CommandContext commandContext) { - return this.holderSupplier.apply(commandContext).registry(this.registryType); - } - - @Override - public @NonNull ArgumentParseResult<@NonNull V> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String input = inputQueue.peek(); - final ResourceKey key = ResourceKeyUtil.resourceKey(input); - if (key == null) { - return ResourceKeyUtil.invalidResourceKey(); - } - final Optional> entry = this.registry(commandContext).findEntry(key); - if (entry.isPresent()) { - inputQueue.remove(); - return ArgumentParseResult.success(entry.get().value()); - } - return ArgumentParseResult.failure(new NoSuchEntryException(commandContext, key, this.registryType)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.registry(commandContext).streamEntries().flatMap(entry -> { - if (!input.isEmpty() && entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { - return Stream.of(entry.key().value(), entry.key().asString()); - } - return Stream.of(entry.key().asString()); - }).collect(Collectors.toList()); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - if (this.registryType.equals(RegistryTypes.SOUND_TYPE)) { - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() - .completions(CommandCompletionProviders.AVAILABLE_SOUNDS); - } else if (this.registryType.equals(RegistryTypes.BIOME)) { - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() - .completions(CommandCompletionProviders.AVAILABLE_BIOMES); - } else if (this.registryType.equals(RegistryTypes.ENTITY_TYPE)) { - return CommandTreeNodeTypes.ENTITY_SUMMON.get().createNode() - .completions(CommandCompletionProviders.SUMMONABLE_ENTITIES); - } else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { - return CommandTreeNodeTypes.ITEM_ENCHANTMENT.get().createNode(); - } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { - return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); - } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { - return CommandTreeNodeTypes.DIMENSION.get().createNode() - .customCompletions(); // Sponge adds custom types (?) - } - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); - } - - } - - /** - * Builder for {@link RegistryEntryArgument}. - * - * @param sender type - * @param value type - */ - public static final class Builder extends TypedBuilder> { - - private final RegistryType registryType; - private final Function, RegistryHolder> holderSupplier; - - Builder( - final @NonNull String name, - final @NonNull TypeToken valueType, - final @NonNull Function, RegistryHolder> holderSupplier, - final @NonNull RegistryType registryType - ) { - super(valueType, name); - this.registryType = registryType; - this.holderSupplier = holderSupplier; - } - - @Override - public @NonNull RegistryEntryArgument build() { - return new RegistryEntryArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getValueType(), - this.holderSupplier, - this.registryType, - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { - return this.asOptionalWithDefault(defaultValue.asString()); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull RegistryReference defaultValue) { - return this.asOptionalWithDefault(defaultValue.location()); - } - - } - - /** - * An exception thrown when there is no entry for the provided {@link ResourceKey} in the resolved registry. - */ - private static final class NoSuchEntryException extends ParserException { - - private static final long serialVersionUID = 4472876671109079272L; - - NoSuchEntryException( - final CommandContext context, - final ResourceKey key, - final RegistryType registryType - ) { - super( - Parser.class, - context, - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, - CaptionVariable.of("id", key.asString()), - CaptionVariable.of("registry", registryType.location().asString()) - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java deleted file mode 100644 index d770ca6d..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyArgument.java +++ /dev/null @@ -1,176 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; - -/** - * Argument for parsing {@link ResourceKey ResourceKeys}. - * - * @param sender type - */ -public final class ResourceKeyArgument extends CommandArgument { - - private ResourceKeyArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - ResourceKey.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new optional {@link ResourceKeyArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ResourceKeyArgument} - */ - public static @NonNull ResourceKeyArgument optional(final @NonNull String name) { - return ResourceKeyArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link ResourceKeyArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link ResourceKeyArgument} - */ - public static @NonNull ResourceKeyArgument optional( - final @NonNull String name, - final @NonNull ResourceKey defaultValue - ) { - return ResourceKeyArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new required {@link ResourceKeyArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link ResourceKeyArgument} - */ - public static @NonNull ResourceKeyArgument of(final @NonNull String name) { - return ResourceKeyArgument.builder(name).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Argument parser for {@link ResourceKey ResourceKey}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - @Override - public @NonNull ArgumentParseResult<@NonNull ResourceKey> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String input = inputQueue.peek(); - final ResourceKey key = ResourceKeyUtil.resourceKey(input); - if (key == null) { - return ResourceKeyUtil.invalidResourceKey(); - } - inputQueue.remove(); - return ArgumentParseResult.success(key); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode(); - } - - } - - /** - * Builder for {@link ResourceKeyArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(ResourceKey.class, name); - } - - @Override - public @NonNull ResourceKeyArgument build() { - return new ResourceKeyArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { - return this.asOptionalWithDefault(defaultValue.asString()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java deleted file mode 100644 index 883e706a..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SingleEntitySelectorArgument.java +++ /dev/null @@ -1,213 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.SingleEntitySelector; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.selector.EntitySelector; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.Entity; - -/** - * Argument for selecting a single {@link Entity} using a {@link Selector}. - * - * @param sender type - */ -public final class SingleEntitySelectorArgument extends CommandArgument { - - private SingleEntitySelectorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - SingleEntitySelector.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link SingleEntitySelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link SingleEntitySelectorArgument} - */ - public static @NonNull SingleEntitySelectorArgument of(final @NonNull String name) { - return SingleEntitySelectorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link SingleEntitySelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link SingleEntitySelectorArgument} - */ - public static @NonNull SingleEntitySelectorArgument optional(final @NonNull String name) { - return SingleEntitySelectorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link SingleEntitySelector}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entity()); - - @Override - public @NonNull ArgumentParseResult<@NonNull SingleEntitySelector> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String originalInput = String.join(" ", inputQueue); - final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); - if (result.getFailure().isPresent()) { - return ArgumentParseResult.failure(result.getFailure().get()); - } - final String consumedInput = String.join(" ", inputQueue); - final EntitySelector parsed = result.getParsedValue().get(); - final Entity entity; - try { - entity = (Entity) parsed.findSingleEntity( - ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - final int consumedChars = originalInput.length() - consumedInput.length(); - final String input = originalInput.substring(0, consumedChars); - return ArgumentParseResult.success(new SingleEntitySelectorImpl((Selector) parsed, input, entity)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.nativeParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ENTITY.get().createNode().single(); - } - - } - - /** - * Builder for {@link SingleEntitySelectorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(SingleEntitySelector.class, name); - } - - @Override - public @NonNull SingleEntitySelectorArgument build() { - return new SingleEntitySelectorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - private static final class SingleEntitySelectorImpl implements SingleEntitySelector { - - private final Selector selector; - private final String inputString; - private final Entity result; - - private SingleEntitySelectorImpl( - final Selector selector, - final String inputString, - final Entity result - ) { - this.selector = selector; - this.inputString = inputString; - this.result = result; - } - - @Override - public @NonNull Selector selector() { - return this.selector; - } - - @Override - public @NonNull String inputString() { - return this.inputString; - } - - @Override - public @NonNull Entity getSingle() { - return this.result; - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java deleted file mode 100644 index e4287cf6..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/SinglePlayerSelectorArgument.java +++ /dev/null @@ -1,215 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.SinglePlayerSelector; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.selector.EntitySelector; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.server.ServerPlayer; - -/** - * Argument for selecting a single {@link Player} using a {@link Selector}. - * - * @param sender type - */ -public final class SinglePlayerSelectorArgument extends CommandArgument { - - private SinglePlayerSelectorArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - SinglePlayerSelector.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link SinglePlayerSelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link SinglePlayerSelectorArgument} - */ - public static @NonNull SinglePlayerSelectorArgument of(final @NonNull String name) { - return SinglePlayerSelectorArgument.builder(name).build(); - } - - /** - * Create a new optional {@link SinglePlayerSelectorArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link SinglePlayerSelectorArgument} - */ - public static @NonNull SinglePlayerSelectorArgument optional(final @NonNull String name) { - return SinglePlayerSelectorArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link SinglePlayerSelector}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.player()); - - @Override - public @NonNull ArgumentParseResult<@NonNull SinglePlayerSelector> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String originalInput = String.join(" ", inputQueue); - final ArgumentParseResult result = this.nativeParser.parse(commandContext, inputQueue); - if (result.getFailure().isPresent()) { - return ArgumentParseResult.failure(result.getFailure().get()); - } - final String consumedInput = String.join(" ", inputQueue); - final EntitySelector parsed = result.getParsedValue().get(); - final ServerPlayer player; - try { - // todo: a more proper fix then setting permission level 2 - player = (ServerPlayer) parsed.findSinglePlayer( - ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - final int consumedChars = originalInput.length() - consumedInput.length(); - final String input = originalInput.substring(0, consumedChars); - return ArgumentParseResult.success(new SinglePlayerSelectorImpl((Selector) parsed, input, player)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.nativeParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly().single(); - } - - } - - /** - * Builder for {@link SinglePlayerSelectorArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(SinglePlayerSelector.class, name); - } - - @Override - public @NonNull SinglePlayerSelectorArgument build() { - return new SinglePlayerSelectorArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - private static final class SinglePlayerSelectorImpl implements SinglePlayerSelector { - - private final Selector selector; - private final String inputString; - private final ServerPlayer result; - - private SinglePlayerSelectorImpl( - final Selector selector, - final String inputString, - final ServerPlayer result - ) { - this.selector = selector; - this.inputString = inputString; - this.result = result; - } - - @Override - public @NonNull Selector selector() { - return this.selector; - } - - @Override - public @NonNull String inputString() { - return this.inputString; - } - - @Override - public @NonNull ServerPlayer getSingle() { - return this.result; - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java deleted file mode 100644 index c449564c..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/UserArgument.java +++ /dev/null @@ -1,282 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.captions.Caption; -import cloud.commandframework.captions.CaptionVariable; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.exceptions.parsing.ParserException; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCaptionKeys; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Queue; -import java.util.UUID; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.selector.EntitySelector; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.command.selector.Selector; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.entity.living.player.server.ServerPlayer; -import org.spongepowered.api.profile.GameProfile; -import org.spongepowered.api.user.UserManager; - -/** - * Argument for parsing {@link User} {@link UUID UUIDs} in the {@link UserManager} from - * a {@link Selector}, last known username, or {@link UUID} string. - * - * @param sender type - */ -public final class UserArgument extends CommandArgument { - - private UserArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - UUID.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link UserArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link UserArgument} - */ - public static @NonNull UserArgument of(final @NonNull String name) { - return UserArgument.builder(name).build(); - } - - /** - * Create a new optional {@link UserArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link UserArgument} - */ - public static @NonNull UserArgument optional(final @NonNull String name) { - return UserArgument.builder(name).asOptional().build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link User Users} in the {@link UserManager} by - * {@link Selector}, last known username, or {@link UUID}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser singlePlayerSelectorParser = - new WrappedBrigadierParser<>(EntityArgument.player()); - - @Override - public @NonNull ArgumentParseResult<@NonNull UUID> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String peek = inputQueue.peek(); - if (peek.startsWith("@")) { - return this.handleSelector(commandContext, inputQueue); - } - - try { - final Optional optionalUser = Sponge.server().gameProfileManager().cache().findByName(peek); - // valid username - if (optionalUser.isPresent()) { - inputQueue.remove(); - return ArgumentParseResult.success(optionalUser.get().uniqueId()); - } - return ArgumentParseResult.failure(new UserNotFoundException( - commandContext, UserNotFoundException.Type.NAME, peek - )); - } catch (final IllegalArgumentException ex) { - // not a valid username - } - - try { - final UUID uuid = UUID.fromString(peek); - // valid uuid - if (Sponge.server().userManager().exists(uuid)) { - return ArgumentParseResult.success(uuid); - } - - return ArgumentParseResult.failure(new UserNotFoundException( - commandContext, UserNotFoundException.Type.UUID, peek - )); - } catch (final IllegalArgumentException ex) { - // not a valid uuid - } - - return ArgumentParseResult.failure(new UserNotFoundException( - commandContext, UserNotFoundException.Type.INVALID_INPUT, peek - )); - } - - private @NonNull ArgumentParseResult<@NonNull UUID> handleSelector( - final @NonNull CommandContext<@NonNull C> commandContext, - final @NonNull Queue<@NonNull String> inputQueue - ) { - final ArgumentParseResult result = this.singlePlayerSelectorParser.parse(commandContext, inputQueue); - if (result.getFailure().isPresent()) { - return ArgumentParseResult.failure(result.getFailure().get()); - } - final EntitySelector parsed = result.getParsedValue().get(); - final ServerPlayer player; - try { - player = (ServerPlayer) parsed.findSinglePlayer( - (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failure(ex); - } - return ArgumentParseResult.success(player.uniqueId()); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - final List suggestions = new ArrayList<>(this.singlePlayerSelectorParser.suggestions(commandContext, input)); - if (!input.startsWith("@")) { - suggestions.addAll(Sponge.server().userManager().streamOfMatches(input) - .filter(GameProfile::hasName) - .map(profile -> profile.name().orElse(null)) - .filter(Objects::nonNull) - .filter(name -> !suggestions.contains(name)) - .collect(Collectors.toList())); - } - return suggestions; - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.GAME_PROFILE.get().createNode().customCompletions(); - } - - } - - /** - * Builder for {@link UserArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(UUID.class, name); - } - - @Override - public @NonNull UserArgument build() { - return new UserArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - } - - /** - * An exception thrown when a {@link User} cannot be found for the provided input. - */ - private static final class UserNotFoundException extends ParserException { - - private static final long serialVersionUID = -24501459406523175L; - - UserNotFoundException( - final CommandContext context, - final @NonNull Type type, - final @NonNull String input - ) { - super( - Parser.class, - context, - type.caption, - type.variable(input) - ); - } - - private enum Type { - UUID("uuid", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID), - NAME("name", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME), - INVALID_INPUT("input", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT); - - private final String key; - private final Caption caption; - - Type(final @NonNull String key, final @NonNull Caption caption) { - this.key = key; - this.caption = caption; - } - - CaptionVariable variable(final @NonNull String input) { - return CaptionVariable.of(this.key, input); - } - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java deleted file mode 100644 index f091e894..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2dArgument.java +++ /dev/null @@ -1,250 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.coordinates.Coordinates; -import net.minecraft.commands.arguments.coordinates.Vec2Argument; -import net.minecraft.world.phys.Vec3; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.math.vector.Vector2d; - -/** - * Argument for parsing {@link Vector2d} from relative, absolute, or local coordinates. - * - *

      Example input strings:

      - *
        - *
      • {@code ~ ~}
      • - *
      • {@code 0.1 -0.5}
      • - *
      • {@code ~1 ~-2}
      • - *
      - * - * @param sender type - */ -public final class Vector2dArgument extends VectorArgument { - - private Vector2dArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final boolean centerIntegers, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(centerIntegers), - defaultValue, - Vector2d.class, - centerIntegers, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new optional {@link Vector2dArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument optional(final @NonNull String name) { - return Vector2dArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link Vector2dArgument}. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument optional(final @NonNull String name, final boolean centerIntegers) { - return Vector2dArgument.builder(name).centerIntegers(centerIntegers).asOptional().build(); - } - - /** - * Create a new optional {@link Vector2dArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument optional(final @NonNull String name, final @NonNull Vector2d defaultValue) { - return Vector2dArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link Vector2dArgument} with the specified default value. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument optional( - final @NonNull String name, - final boolean centerIntegers, - final @NonNull Vector2d defaultValue - ) { - return Vector2dArgument.builder(name).centerIntegers(centerIntegers).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new required {@link Vector2dArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument of(final @NonNull String name) { - return Vector2dArgument.builder(name).build(); - } - - /** - * Create a new required {@link Vector2dArgument}. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param sender type - * @return a new {@link Vector2dArgument} - */ - public static @NonNull Vector2dArgument of(final @NonNull String name, final boolean centerIntegers) { - return Vector2dArgument.builder(name).centerIntegers(centerIntegers).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link Vector2d}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser; - - /** - * Create a new {@link Parser}. - * - * @param centerIntegers whether to center integers to x.5 - */ - public Parser(final boolean centerIntegers) { - this.mappedParser = new WrappedBrigadierParser(new Vec2Argument(centerIntegers)) - .map((ctx, coordinates) -> { - final Vec3 position = coordinates.getPosition( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) - ); - return ArgumentParseResult.success(new Vector2d(position.x, position.z)); - }); - } - - @Override - public @NonNull ArgumentParseResult<@NonNull Vector2d> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.VEC2.get().createNode(); - } - - } - - /** - * Builder for {@link Vector2dArgument}. - * - * @param sender type - */ - public static final class Builder extends VectorArgumentBuilder> { - - Builder(final @NonNull String name) { - super(Vector2d.class, name); - } - - @Override - public @NonNull Vector2dArgument build() { - return new Vector2dArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.centerIntegers(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull Vector2d defaultValue) { - return this.asOptionalWithDefault(String.format("%.10f %.10f", defaultValue.x(), defaultValue.y())); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java deleted file mode 100644 index 88af3b56..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector2iArgument.java +++ /dev/null @@ -1,202 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.coordinates.ColumnPosArgument; -import net.minecraft.commands.arguments.coordinates.Coordinates; -import net.minecraft.core.BlockPos; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.math.vector.Vector2i; - -/** - * Argument for parsing {@link Vector2i} from relative, absolute, or local coordinates. - * - *

      Example input strings:

      - *
        - *
      • {@code ~ ~}
      • - *
      • {@code 12 -7}
      • - *
      • {@code ^-1 ^0}
      • - *
      • {@code ~-1 ~5}
      • - *
      • {@code ^ ^}
      • - *
      - * - * @param sender type - */ -public final class Vector2iArgument extends CommandArgument { - - private Vector2iArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - Vector2i.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link Vector2iArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector2iArgument} - */ - public static @NonNull Vector2iArgument of(final @NonNull String name) { - return Vector2iArgument.builder(name).build(); - } - - /** - * Create a new optional {@link Vector2iArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector2iArgument} - */ - public static @NonNull Vector2iArgument optional(final @NonNull String name) { - return Vector2iArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link Vector2iArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector2iArgument} - */ - public static @NonNull Vector2iArgument optional(final @NonNull String name, final @NonNull Vector2i defaultValue) { - return Vector2iArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link Vector2i}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(ColumnPosArgument.columnPos()) - .map((ctx, coordinates) -> { - final BlockPos pos = coordinates.getBlockPos( - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) - ); - return ArgumentParseResult.success(new Vector2i(pos.getX(), pos.getZ())); - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull Vector2i> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.COLUMN_POS.get().createNode(); - } - - } - - /** - * Builder for {@link Vector2iArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(Vector2i.class, name); - } - - @Override - public @NonNull Vector2iArgument build() { - return new Vector2iArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull Vector2i defaultValue) { - return this.asOptionalWithDefault( - String.format("%s %s", defaultValue.x(), defaultValue.y()) - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java deleted file mode 100644 index cea124dd..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3dArgument.java +++ /dev/null @@ -1,252 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.coordinates.Coordinates; -import net.minecraft.commands.arguments.coordinates.Vec3Argument; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.common.util.VecHelper; -import org.spongepowered.math.vector.Vector3d; - -/** - * Argument for parsing {@link Vector3d} from relative, absolute, or local coordinates. - * - *

      Example input strings:

      - *
        - *
      • {@code ~ ~ ~}
      • - *
      • {@code 0.1 -0.5 .9}
      • - *
      • {@code ~1 ~-2 ~10}
      • - *
      • {@code ^1 ^ ^-5}
      • - *
      - * - * @param sender type - */ -public final class Vector3dArgument extends VectorArgument { - - private Vector3dArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final boolean centerIntegers, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(centerIntegers), - defaultValue, - Vector3d.class, - centerIntegers, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link Vector3dArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument of(final @NonNull String name) { - return Vector3dArgument.builder(name).build(); - } - - /** - * Create a new required {@link Vector3dArgument}. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument of(final @NonNull String name, final boolean centerIntegers) { - return Vector3dArgument.builder(name).centerIntegers(centerIntegers).build(); - } - - /** - * Create a new optional {@link Vector3dArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument optional(final @NonNull String name) { - return Vector3dArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link Vector3dArgument}. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument optional(final @NonNull String name, final boolean centerIntegers) { - return Vector3dArgument.builder(name).asOptional().centerIntegers(centerIntegers).build(); - } - - /** - * Create a new optional {@link Vector3dArgument}. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument optional(final @NonNull String name, final @NonNull Vector3d defaultValue) { - return Vector3dArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new optional {@link Vector3dArgument}. - * - * @param name argument name - * @param centerIntegers whether to center integers to x.5 - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector3dArgument} - */ - public static @NonNull Vector3dArgument optional( - final @NonNull String name, - final boolean centerIntegers, - final @NonNull Vector3d defaultValue - ) { - return Vector3dArgument.builder(name).asOptionalWithDefault(defaultValue).centerIntegers(centerIntegers).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link Vector3d}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser; - - /** - * Create a new {@link Parser}. - * - * @param centerIntegers whether to center integers to x.5 - */ - public Parser(final boolean centerIntegers) { - this.mappedParser = new WrappedBrigadierParser(new Vec3Argument(centerIntegers)) - .map((ctx, coordinates) -> { - return ArgumentParseResult.success(VecHelper.toVector3d( - coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) - )); - }); - } - - @Override - public @NonNull ArgumentParseResult<@NonNull Vector3d> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.VEC3.get().createNode(); - } - - } - - /** - * Builder for {@link Vector3dArgument}. - * - * @param sender type - */ - public static final class Builder extends VectorArgumentBuilder> { - - Builder(final @NonNull String name) { - super(Vector3d.class, name); - } - - @Override - public @NonNull Vector3dArgument build() { - return new Vector3dArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.centerIntegers(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull Vector3d defaultValue) { - return this.asOptionalWithDefault( - String.format("%.10f %.10f %.10f", defaultValue.x(), defaultValue.y(), defaultValue.z()) - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java deleted file mode 100644 index 7d9dce3e..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/Vector3iArgument.java +++ /dev/null @@ -1,200 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.brigadier.argument.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import java.util.List; -import java.util.Queue; -import java.util.function.BiFunction; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.arguments.coordinates.BlockPosArgument; -import net.minecraft.commands.arguments.coordinates.Coordinates; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.common.util.VecHelper; -import org.spongepowered.math.vector.Vector3i; - -/** - * Argument for parsing {@link Vector3i} from relative, absolute, or local coordinates. - * - *

      Example input strings:

      - *
        - *
      • {@code ~ ~ ~}
      • - *
      • {@code 1 1 1}
      • - *
      • {@code ~0.5 ~-2 ~10}
      • - *
      • {@code ^1 ^ ^-5}
      • - *
      - * - * @param sender type - */ -public final class Vector3iArgument extends CommandArgument { - - private Vector3iArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - Vector3i.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link Vector3iArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector3iArgument} - */ - public static @NonNull Vector3iArgument of(final @NonNull String name) { - return Vector3iArgument.builder(name).build(); - } - - /** - * Create a new optional {@link Vector3iArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link Vector3iArgument} - */ - public static @NonNull Vector3iArgument optional(final @NonNull String name) { - return Vector3iArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link Vector3iArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link Vector3iArgument} - */ - public static @NonNull Vector3iArgument optional(final @NonNull String name, final @NonNull Vector3i defaultValue) { - return Vector3iArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link Vector3i}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private final ArgumentParser mappedParser = - new WrappedBrigadierParser(BlockPosArgument.blockPos()) - .map((ctx, coordinates) -> { - return ArgumentParseResult.success(VecHelper.toVector3i( - coordinates.getBlockPos((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) - )); - }); - - @Override - public @NonNull ArgumentParseResult<@NonNull Vector3i> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - return this.mappedParser.parse(commandContext, inputQueue); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return this.mappedParser.suggestions(commandContext, input); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.BLOCK_POS.get().createNode(); - } - - } - - /** - * Builder for {@link Vector3iArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(Vector3i.class, name); - } - - @Override - public @NonNull Vector3iArgument build() { - return new Vector3iArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull Vector3i defaultValue) { - return this.asOptionalWithDefault( - String.format("%s %s %s", defaultValue.x(), defaultValue.y(), defaultValue.z()) - ); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java deleted file mode 100644 index 16c40c26..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/VectorArgument.java +++ /dev/null @@ -1,110 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.context.CommandContext; -import java.util.List; -import java.util.function.BiFunction; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -/** - * Parent of {@link Vector3dArgument} and {@link Vector2dArgument} containing shared methods. - * - *

      Not for extension by API users.

      - * - * @param sender type - * @param vector type - */ -public abstract class VectorArgument extends CommandArgument { - - private final boolean centerIntegers; - - protected VectorArgument( - final boolean required, - final @NonNull String name, - final @NonNull ArgumentParser parser, - final @NonNull String defaultValue, - final @NonNull Class vectorType, - final boolean centerIntegers, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super(required, name, parser, defaultValue, vectorType, suggestionsProvider, defaultDescription); - this.centerIntegers = centerIntegers; - } - - /** - * Get whether integers will be centered to x.5. Defaults to false. - * - * @return whether integers will be centered - */ - public boolean centerIntegers() { - return this.centerIntegers; - } - - /** - * Parent of {@link Vector3dArgument.Builder} and {@link Vector2dArgument.Builder}. - * - *

      Not for extension by API users.

      - * - * @param sender type - * @param vector type - * @param builder subtype - */ - public abstract static class VectorArgumentBuilder> - extends TypedBuilder { - - private boolean centerIntegers = false; - - protected VectorArgumentBuilder(final @NonNull Class vectorClass, final @NonNull String name) { - super(vectorClass, name); - } - - /** - * Set whether integers will be centered to x.5. Will be false by default if unset. - * - * @param centerIntegers whether integers will be centered - * @return this builder - */ - public @NonNull B centerIntegers(final boolean centerIntegers) { - this.centerIntegers = centerIntegers; - return this.self(); - } - - /** - * Get whether integers will be centered to x.5. Defaults to false. - * - * @return whether integers will be centered - */ - public boolean centerIntegers() { - return this.centerIntegers; - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java deleted file mode 100644 index a9ab5965..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/WorldArgument.java +++ /dev/null @@ -1,216 +0,0 @@ -// -// MIT License -// -// Copyright (c) 2022 Alexander Söderberg & Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -package cloud.commandframework.sponge.argument; - -import cloud.commandframework.ArgumentDescription; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.sponge.NodeSupplyingArgumentParser; -import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import net.minecraft.commands.arguments.DimensionArgument; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.spongepowered.api.ResourceKey; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.registrar.tree.CommandTreeNode; -import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; -import org.spongepowered.api.world.server.ServerWorld; -import org.spongepowered.api.world.server.WorldManager; - -/** - * Argument for retrieving {@link ServerWorld ServerWorlds} from the {@link WorldManager} by their {@link ResourceKey}. - * - * @param sender type - */ -public final class WorldArgument extends CommandArgument { - - private WorldArgument( - final boolean required, - final @NonNull String name, - final @NonNull String defaultValue, - final @Nullable BiFunction, String, List> suggestionsProvider, - final @NonNull ArgumentDescription defaultDescription - ) { - super( - required, - name, - new Parser<>(), - defaultValue, - ServerWorld.class, - suggestionsProvider, - defaultDescription - ); - } - - /** - * Create a new required {@link WorldArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link WorldArgument} - */ - public static @NonNull WorldArgument of(final @NonNull String name) { - return WorldArgument.builder(name).build(); - } - - /** - * Create a new optional {@link WorldArgument}. - * - * @param name argument name - * @param sender type - * @return a new {@link WorldArgument} - */ - public static @NonNull WorldArgument optional(final @NonNull String name) { - return WorldArgument.builder(name).asOptional().build(); - } - - /** - * Create a new optional {@link WorldArgument} with the specified default value. - * - * @param name argument name - * @param defaultValue default value - * @param sender type - * @return a new {@link WorldArgument} - */ - public static @NonNull WorldArgument optional(final @NonNull String name, final @NonNull ResourceKey defaultValue) { - return WorldArgument.builder(name).asOptionalWithDefault(defaultValue).build(); - } - - /** - * Create a new {@link Builder}. - * - * @param name argument name - * @param sender type - * @return a new {@link Builder} - */ - public static @NonNull Builder builder(final @NonNull String name) { - return new Builder<>(name); - } - - /** - * Parser for {@link ServerWorld ServerWorlds} in the {@link WorldManager}. - * - * @param sender type - */ - public static final class Parser implements NodeSupplyingArgumentParser { - - private static final DynamicCommandExceptionType ERROR_INVALID_VALUE; - - static { - try { - // ERROR_INVALID_VALUE (todo: use accessor) - final Field errorInvalidValueField = Arrays.stream(DimensionArgument.class.getDeclaredFields()) - .filter(f -> f.getType().equals(DynamicCommandExceptionType.class)) - .findFirst() - .orElseThrow(IllegalStateException::new); - errorInvalidValueField.setAccessible(true); - ERROR_INVALID_VALUE = (DynamicCommandExceptionType) errorInvalidValueField.get(null); - } catch (final Exception ex) { - throw new RuntimeException("Couldn't access ERROR_INVALID_VALUE command exception type.", ex); - } - } - - @Override - public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final Queue<@NonNull String> inputQueue - ) { - final String input = inputQueue.peek(); - final ResourceKey key = ResourceKeyUtil.resourceKey(input); - if (key == null) { - return ResourceKeyUtil.invalidResourceKey(); - } - final Optional entry = Sponge.server().worldManager().world(key); - if (entry.isPresent()) { - inputQueue.remove(); - return ArgumentParseResult.success(entry.get()); - } - return ArgumentParseResult.failure(ERROR_INVALID_VALUE.create(key)); - } - - @Override - public @NonNull List<@NonNull String> suggestions( - final @NonNull CommandContext commandContext, - final @NonNull String input - ) { - return Sponge.server().worldManager().worlds().stream().flatMap(world -> { - if (!input.isEmpty() && world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { - return Stream.of(world.key().value(), world.key().asString()); - } - return Stream.of(world.key().asString()); - }).collect(Collectors.toList()); - } - - @Override - public CommandTreeNode.@NonNull Argument> node() { - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); - } - - } - - /** - * Builder for {@link WorldArgument}. - * - * @param sender type - */ - public static final class Builder extends TypedBuilder> { - - Builder(final @NonNull String name) { - super(ServerWorld.class, name); - } - - @Override - public @NonNull WorldArgument build() { - return new WorldArgument<>( - this.isRequired(), - this.getName(), - this.getDefaultValue(), - this.getSuggestionsProvider(), - this.getDefaultDescription() - ); - } - - /** - * Sets the command argument to be optional, with the specified default value. - * - * @param defaultValue default value - * @return this builder - * @see CommandArgument.Builder#asOptionalWithDefault(String) - */ - public @NonNull Builder asOptionalWithDefault(final @NonNull ResourceKey defaultValue) { - return this.asOptionalWithDefault(defaultValue.asString()); - } - - } - -} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java new file mode 100644 index 00000000..c61231d1 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -0,0 +1,151 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.data.BlockInput; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.arguments.blocks.BlockStateArgument; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.world.BlockChangeFlag; +import org.spongepowered.api.world.BlockChangeFlags; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.common.data.persistence.NBTTranslator; +import org.spongepowered.common.util.VecHelper; +import org.spongepowered.common.world.SpongeBlockChangeFlag; + +/** + * An argument for parsing {@link BlockInput} from a {@link BlockState} + * and optional extra NBT data. + * + *

      Example input strings:

      + *
        + *
      • {@code stone}
      • + *
      • {@code minecraft:stone}
      • + *
      • {@code andesite_stairs[waterlogged=true,facing=east]}
      • + *
      + * + * @param sender type + */ +public final class BlockInputParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor blockInputParser() { + return ParserDescriptor.of(new BlockInputParser<>(), BlockInput.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(BlockStateArgument.block()) + .flatMapSuccess((ctx, blockInput) -> ArgumentParseResult.successFuture(new BlockInputImpl(blockInput))); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.BLOCK_STATE.get().createNode(); + } + + private static final class BlockInputImpl implements BlockInput { + + // todo: use accessor + private static final Field COMPOUND_TAG_FIELD = + Arrays.stream(net.minecraft.commands.arguments.blocks.BlockInput.class.getDeclaredFields()) + .filter(f -> f.getType().equals(CompoundTag.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); + + static { + COMPOUND_TAG_FIELD.setAccessible(true); + } + + private final net.minecraft.commands.arguments.blocks.BlockInput blockInput; + private final @Nullable DataContainer extraData; + + BlockInputImpl(final net.minecraft.commands.arguments.blocks.@NonNull BlockInput blockInput) { + this.blockInput = blockInput; + try { + final CompoundTag tag = (CompoundTag) COMPOUND_TAG_FIELD.get(blockInput); + this.extraData = tag == null ? null : NBTTranslator.INSTANCE.translate(tag); + } catch (final IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public @NonNull BlockState blockState() { + return (BlockState) this.blockInput.getState(); + } + + @Override + public @Nullable DataContainer extraData() { + return this.extraData; + } + + @Override + public boolean place(final @NonNull ServerLocation location) { + return this.place(location, BlockChangeFlags.DEFAULT_PLACEMENT); + } + + @Override + public boolean place(final @NonNull ServerLocation location, final @NonNull BlockChangeFlag flag) { + return this.blockInput.place( + (ServerLevel) location.world(), + VecHelper.toBlockPos(location.position()), + ((SpongeBlockChangeFlag) flag).getRawFlag() + ); + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java new file mode 100644 index 00000000..cb9250f2 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -0,0 +1,134 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.BlockPredicate; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.pattern.BlockInWorld; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.common.util.VecHelper; + +/** + * An argument for parsing {@link BlockPredicate BlockPredicates}. + * + * @param sender type + */ +public final class BlockPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + + public static ParserDescriptor blockPredicateParser() { + return ParserDescriptor.of(new BlockPredicateParser<>(), BlockPredicate.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() + ).flatMapSuccess((ctx, result) -> { + final CommandSourceStack commandSourceStack = + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); + try { + return ArgumentParseResult.successFuture( + new BlockPredicateImpl(result.create(commandSourceStack.getLevel().getTagManager())) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failureFuture(ex); + } + }); + + @Override + public @NonNull CompletableFuture<@NonNull ArgumentParseResult> parseFuture( + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput commandInput + ) { + return this.mappedParser.parseFuture(commandContext, commandInput); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.BLOCK_PREDICATE.get().createNode(); + } + + private static final class BlockPredicateImpl implements BlockPredicate { + + private final Predicate predicate; + + BlockPredicateImpl(final @NonNull Predicate predicate) { + this.predicate = predicate; + } + + private boolean testImpl(final @NonNull ServerLocation location, final boolean loadChunks) { + return this.predicate.test(new BlockInWorld( + (ServerLevel) location.world(), + VecHelper.toBlockPos(location.position()), + loadChunks + )); + } + + @Override + public boolean test(final @NonNull ServerLocation location) { + return this.testImpl(location, false); + } + + @Override + public @NonNull BlockPredicate loadChunks() { + return new BlockPredicate() { + @Override + public @NonNull BlockPredicate loadChunks() { + return this; + } + + @Override + public boolean test(final @NonNull ServerLocation location) { + return BlockPredicateImpl.this.testImpl(location, true); + } + }; + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java new file mode 100644 index 00000000..98fe06cd --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java @@ -0,0 +1,80 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import java.util.concurrent.CompletableFuture; +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.common.adventure.SpongeAdventure; + +/** + * An argument for parsing {@link Component Components} from json formatted text. + * + * @param sender type + */ +public final class ComponentParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + + public static ParserDescriptor componentParser() { + return ParserDescriptor.of(new ComponentParser<>(), Component.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.ComponentArgument.textComponent() + ).flatMapSuccess((ctx, component) -> + ArgumentParseResult.successFuture(SpongeAdventure.asAdventure(component))); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.COMPONENT.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java new file mode 100644 index 00000000..86befb5b --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java @@ -0,0 +1,79 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.arguments.CompoundTagArgument; +import net.minecraft.nbt.CompoundTag; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.common.data.persistence.NBTTranslator; + +/** + * Argument for parsing {@link DataContainer DataContainers} from + * SNBT strings. + * + * @param sender type + */ +public final class DataContainerParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + + public static ParserDescriptor dataContainerParser() { + return ParserDescriptor.of(new DataContainerParser<>(), DataContainer.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(CompoundTagArgument.compoundTag()) + .flatMapSuccess((ctx, compoundTag) -> + ArgumentParseResult.successFuture(NBTTranslator.INSTANCE.translate(compoundTag))); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.NBT_COMPOUND_TAG.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java new file mode 100644 index 00000000..1e86d244 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java @@ -0,0 +1,133 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.GameProfileCollection; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.GameProfileArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.framework.qual.DefaultQualifier; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.common.profile.SpongeGameProfile; + +/** + * Argument for parsing a {@link Collection} of {@link GameProfile GameProfiles} from a + * {@link Selector}. A successfully parsed result will contain at least one element. + * + * @param sender type + */ +public final class GameProfileCollectionParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor gameProfileCollectionParser() { + return ParserDescriptor.of(new GameProfileCollectionParser<>(), GameProfileCollection.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.GameProfileArgument.gameProfile() + ).flatMapSuccess((ctx, argumentResult) -> { + final Collection profiles; + try { + profiles = argumentResult.getNames( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failureFuture(ex); + } + final List result = profiles.stream() + .map(SpongeGameProfile::of).collect(Collectors.toList()); + return ArgumentParseResult.successFuture(new GameProfileCollectionImpl(Collections.unmodifiableCollection(result))); + }); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); + } + + + @DefaultQualifier(NonNull.class) + private static final class GameProfileCollectionImpl extends AbstractCollection + implements GameProfileCollection { + + private final Collection backing; + + private GameProfileCollectionImpl(final Collection backing) { + this.backing = backing; + } + + @Override + public int size() { + return this.backing.size(); + } + + @Override + public Iterator iterator() { + return this.backing.iterator(); + } + + @Override + public boolean add(final GameProfile gameProfile) { + return this.backing.add(gameProfile); + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java new file mode 100644 index 00000000..51868453 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java @@ -0,0 +1,118 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.exceptions.parsing.ParserException; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCaptionKeys; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.common.profile.SpongeGameProfile; + +/** + * Argument for parsing a single {@link GameProfile} from a {@link Selector}. + * + * @param sender type + */ +public final class GameProfileParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + + public static ParserDescriptor gameProfileParser() { + return ParserDescriptor.of(new GameProfileParser<>(), GameProfile.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + net.minecraft.commands.arguments.GameProfileArgument.gameProfile() + ).flatMapSuccess((ctx, argumentResult) -> { + final Collection profiles; + try { + profiles = argumentResult.getNames( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failureFuture(ex); + } + if (profiles.size() > 1) { + return ArgumentParseResult.failureFuture(new TooManyGameProfilesSelectedException(ctx)); + } + final GameProfile profile = SpongeGameProfile.of(profiles.iterator().next()); + return ArgumentParseResult.successFuture(profile); + }); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode(); + } + + + /** + * Exception thrown when too many game profiles are selected. + */ + private static final class TooManyGameProfilesSelectedException extends ParserException { + + private static final long serialVersionUID = -2931411139985042222L; + + TooManyGameProfilesSelectedException(final @NonNull CommandContext context) { + super( + GameProfileParser.class, + context, + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED + ); + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java new file mode 100644 index 00000000..b91eac4d --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -0,0 +1,130 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.ItemStackPredicate; +import com.mojang.brigadier.context.StringRange; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.item.ItemPredicateArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.item.inventory.ItemStack; + +/** + * An argument for parsing {@link ItemStackPredicate ItemStackPredicates}. + * + * @param sender type + */ +public final class ItemStackPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + + public static ParserDescriptor itemStackPredicateParser() { + return ParserDescriptor.of(new ItemStackPredicateParser<>(), ItemStackPredicate.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser( + ItemPredicateArgument.itemPredicate() + ).flatMapSuccess((ctx, result) -> { + final CommandSourceStack commandSourceStack = + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); + try { + final com.mojang.brigadier.context.CommandContext dummyContext = + createDummyContext(ctx, commandSourceStack); + return ArgumentParseResult.successFuture(new ItemStackPredicateImpl(result.create(dummyContext))); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failureFuture(ex); + } + }); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ITEM_PREDICATE.get().createNode(); + } + + private static final class ItemStackPredicateImpl implements ItemStackPredicate { + + private final Predicate predicate; + + ItemStackPredicateImpl(final @NonNull Predicate predicate) { + this.predicate = predicate; + } + + @SuppressWarnings("ConstantConditions") + @Override + public boolean test(final @NonNull ItemStack itemStack) { + return this.predicate.test((net.minecraft.world.item.ItemStack) (Object) itemStack); + } + + } + + private static com.mojang.brigadier.context.@NonNull CommandContext createDummyContext( + final @NonNull CommandContext ctx, + final @NonNull CommandSourceStack commandSourceStack + ) { + return new com.mojang.brigadier.context.CommandContext<>( + commandSourceStack, + ctx.rawInput().input(), + Collections.emptyMap(), + null, + null, + Collections.emptyList(), + StringRange.at(0), + null, + null, + false + ); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java new file mode 100644 index 00000000..c4cae07e --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java @@ -0,0 +1,134 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.MultipleEntitySelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.Entity; + +/** + * Argument for selecting one or more {@link Entity Entities} using a {@link Selector}. + * + * @param sender type + */ +public final class MultipleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor multipleEntitySelectorParser() { + return ParserDescriptor.of(new MultipleEntitySelectorParser<>(), MultipleEntitySelector.class); + } + + + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entities()); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final CommandInput originalInput = inputQueue.copy(); + return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { + if (result.failure().isPresent()) { + return ArgumentParseResult.failure(result.failure().get()); + } + final String consumedInput = originalInput.difference(inputQueue); + final EntitySelector parsed = result.parsedValue().get(); + final List entities; + try { + entities = parsed.findEntities( + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) + ).stream().map(e -> (Entity) e).collect(Collectors.toList()); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(new MultipleEntitySelectorImpl((Selector) parsed, consumedInput, entities)); + }); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.nativeParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ENTITY.get().createNode(); + } + + private static final class MultipleEntitySelectorImpl implements MultipleEntitySelector { + + private final Selector selector; + private final String inputString; + private final Collection result; + + private MultipleEntitySelectorImpl( + final Selector selector, + final String inputString, + final Collection result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Collection get() { + return this.result; + } + + } +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java new file mode 100644 index 00000000..88e8f9b9 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java @@ -0,0 +1,135 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.MultiplePlayerSelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; + +/** + * Argument for selecting one or more {@link Player Players} using a {@link Selector}. + * + * @param sender type + */ +public final class MultiplePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor multiplePlayerSelectorParser() { + return ParserDescriptor.of(new MultiplePlayerSelectorParser<>(), MultiplePlayerSelector.class); + } + + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.players()); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final CommandInput originalInput = inputQueue.copy(); + return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { + if (result.failure().isPresent()) { + return ArgumentParseResult.failure(result.failure().get()); + } + final String consumedInput = originalInput.difference(inputQueue); + final EntitySelector parsed = result.parsedValue().get(); + final List players; + try { + players = parsed.findPlayers( + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) + ).stream().map(p -> (ServerPlayer) p).collect(Collectors.toList()); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(new MultiplePlayerSelectorImpl((Selector) parsed, consumedInput, players)); + }); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.nativeParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly(); + } + + private static final class MultiplePlayerSelectorImpl implements MultiplePlayerSelector { + + private final Selector selector; + private final String inputString; + private final Collection result; + + private MultiplePlayerSelectorImpl( + final Selector selector, + final String inputString, + final Collection result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Collection get() { + return this.result; + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java new file mode 100644 index 00000000..71bc0b98 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java @@ -0,0 +1,78 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import java.util.ArrayList; +import java.util.Locale; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minecraft.commands.arguments.ColorArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; + +/** + * An argument for parsing {@link NamedTextColor NamedTextColors}. + * + * @param sender type + */ +public final class NamedTextColorParser implements NodeSource, ArgumentParser, BlockingSuggestionProvider.Strings { + + public static ParserDescriptor namedTextColorParser() { + return ParserDescriptor.of(new NamedTextColorParser<>(), NamedTextColor.class); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull NamedTextColor> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final String input = inputQueue.readString().toLowerCase(Locale.ROOT); + final NamedTextColor color = NamedTextColor.NAMES.value(input); + if (color != null) { + return ArgumentParseResult.success(color); + } + return ArgumentParseResult.failure(ColorArgument.ERROR_INVALID_VALUE.create(input)); + } + + @Override + public @NonNull Iterable<@NonNull String> stringSuggestions( + final @NonNull CommandContext commandContext, + final @NonNull CommandInput input + ) { + return new ArrayList<>(NamedTextColor.NAMES.keys()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.COLOR.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java new file mode 100644 index 00000000..efe4049e --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java @@ -0,0 +1,99 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import java.lang.reflect.Method; +import java.util.Optional; +import java.util.stream.Collectors; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.parameter.managed.operator.Operator; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.registry.RegistryTypes; + +/** + * An argument for parsing {@link Operator Operators}. + * + * @param sender type + */ +public final class OperatorParser implements NodeSource, ArgumentParser, BlockingSuggestionProvider.Strings { + + public static ParserDescriptor operatorParser() { + return ParserDescriptor.of(new OperatorParser<>(), Operator.class); + } + + private static final SimpleCommandExceptionType ERROR_INVALID_OPERATION; + + static { + try { + // todo: fix in a better way + final Class spongeAccessor = + Class.forName("org.spongepowered.common.accessor.commands.arguments.OperationArgumentAccessor"); + final Method get = spongeAccessor.getDeclaredMethod("accessor$ERROR_INVALID_OPERATION"); + get.setAccessible(true); + ERROR_INVALID_OPERATION = (SimpleCommandExceptionType) get.invoke(null); + } catch (final ReflectiveOperationException ex) { + throw new RuntimeException("Couldn't access ERROR_INVALID_OPERATION command exception type.", ex); + } + } + + @Override + public @NonNull ArgumentParseResult<@NonNull Operator> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final String input = inputQueue.readString(); + final Optional operator = RegistryTypes.OPERATOR.get().stream() + .filter(op -> op.asString().equals(input)) + .findFirst(); + if (!operator.isPresent()) { + return ArgumentParseResult.failure(ERROR_INVALID_OPERATION.create()); + } + return ArgumentParseResult.success(operator.get()); + } + + @Override + public @NonNull Iterable<@NonNull String> stringSuggestions( + final @NonNull CommandContext commandContext, + final @NonNull CommandInput input + ) { + return RegistryTypes.OPERATOR.get().stream() + .map(Operator::asString) + .collect(Collectors.toList()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.OPERATION.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java new file mode 100644 index 00000000..3fa2ff03 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -0,0 +1,158 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.data.ProtoItemStack; +import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import net.kyori.adventure.util.ComponentMessageThrowable; +import net.minecraft.commands.arguments.item.ItemArgument; +import net.minecraft.commands.arguments.item.ItemInput; +import net.minecraft.nbt.CompoundTag; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.item.ItemType; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.ItemStackSnapshot; +import org.spongepowered.common.data.persistence.NBTTranslator; + +/** + * An argument for parsing {@link ProtoItemStack ProtoItemStacks} from an {@link ItemType} identifier + * and optional NBT data. The stack size of the resulting snapshot will always be {@code 1}. + * + *

      Example input strings:

      + *
        + *
      • {@code apple}
      • + *
      • {@code minecraft:apple}
      • + *
      • {@code diamond_sword{Enchantments:[{id:sharpness,lvl:5}]}}
      • + *
      + * + * @param sender type + */ +public final class ProtoItemStackParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor protoItemStackParser() { + return ParserDescriptor.of(new ProtoItemStackParser<>(), ProtoItemStack.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(ItemArgument.item()) + .flatMapSuccess((ctx, itemInput) -> ArgumentParseResult.successFuture(new ProtoItemStackImpl(itemInput))); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ITEM_STACK.get().createNode(); + } + + private static final class ProtoItemStackImpl implements ProtoItemStack { + + // todo: use accessor + private static final Field COMPOUND_TAG_FIELD = + Arrays.stream(ItemInput.class.getDeclaredFields()) + .filter(f -> f.getType().equals(CompoundTag.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); + + static { + COMPOUND_TAG_FIELD.setAccessible(true); + } + + private final ItemInput itemInput; + private final @Nullable DataContainer extraData; + + ProtoItemStackImpl(final @NonNull ItemInput itemInput) { + this.itemInput = itemInput; + try { + final CompoundTag tag = (CompoundTag) COMPOUND_TAG_FIELD.get(itemInput); + this.extraData = tag == null ? null : NBTTranslator.INSTANCE.translate(tag); + } catch (final IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public @NonNull ItemType itemType() { + return (ItemType) this.itemInput.getItem(); + } + + @Override + public @Nullable DataContainer extraData() { + return this.extraData; + } + + @SuppressWarnings("ConstantConditions") + @Override + public @NonNull ItemStack createItemStack( + final int stackSize, + final boolean respectMaximumStackSize + ) throws ComponentMessageRuntimeException { + try { + return (ItemStack) (Object) this.itemInput.createItemStack(stackSize, respectMaximumStackSize); + } catch (final CommandSyntaxException ex) { + throw new ComponentMessageRuntimeException(ComponentMessageThrowable.getMessage(ex), ex); + } + } + + @Override + public @NonNull ItemStackSnapshot createItemStackSnapshot( + final int stackSize, + final boolean respectMaximumStackSize + ) throws ComponentMessageRuntimeException { + return this.createItemStack(stackSize, respectMaximumStackSize).createSnapshot(); + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java new file mode 100644 index 00000000..15f3534f --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -0,0 +1,258 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; +import cloud.commandframework.captions.CaptionVariable; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.exceptions.parsing.ParserException; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCaptionKeys; +import io.leangen.geantyref.TypeToken; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.command.registrar.tree.CommandCompletionProviders; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.registry.DefaultedRegistryType; +import org.spongepowered.api.registry.Registry; +import org.spongepowered.api.registry.RegistryEntry; +import org.spongepowered.api.registry.RegistryHolder; +import org.spongepowered.api.registry.RegistryType; +import org.spongepowered.api.registry.RegistryTypes; + +/** + * An argument for retrieving values from any of Sponge's {@link Registry Registries}. + * + * @param sender type + * @param value type + */ +public final class RegistryEntryParser implements NodeSource, ArgumentParser.FutureArgumentParser, BlockingSuggestionProvider.Strings { + + // Start DefaultedRegistryType methods + + /** + * Create a new required {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. + * + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryParser} + */ + public static @NonNull ParserDescriptor registryEntryParser( + final @NonNull TypeToken valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return ParserDescriptor.of(new RegistryEntryParser<>(registryType), valueType); + } + + /** + * Create a new required {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. + * + * @param valueType value type + * @param registryType registry type + * @param sender type + * @param value type + * @return a new {@link RegistryEntryParser} + */ + public static @NonNull ParserDescriptor registryEntryParser( + final @NonNull Class valueType, + final @NonNull DefaultedRegistryType registryType + ) { + return ParserDescriptor.of(new RegistryEntryParser<>(registryType), valueType); + } + + // End DefaultedRegistryType methods + + // Start RegistryType methods + + /** + * Create a new required {@link RegistryEntryParser} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #registryEntryParser(TypeToken, DefaultedRegistryType)}.

      + * + * @param sender type + * @param value type + * @param valueType value type + * @param registryType registry type + * @param holderSupplier registry holder function + * @return a new {@link RegistryEntryParser} + */ + public static @NonNull ParserDescriptor registryEntryParser( + final @NonNull Class valueType, + final @NonNull RegistryType registryType, + final @NonNull Function, RegistryHolder> holderSupplier + ) { + return ParserDescriptor.of(new RegistryEntryParser<>(holderSupplier, registryType), valueType); + } + + /** + * Create a new required {@link RegistryEntryParser} for a {@link RegistryType} + * using the specified {@link RegistryHolder} function. + * + *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #registryEntryParser(TypeToken, DefaultedRegistryType)}.

      + * + * @param sender type + * @param value type + * @param valueType value type + * @param registryType registry type + * @param holderSupplier registry holder function + * @return a new {@link RegistryEntryParser} + */ + public static @NonNull ParserDescriptor registryEntryParser( + final @NonNull TypeToken valueType, + final @NonNull RegistryType registryType, + final @NonNull Function, RegistryHolder> holderSupplier + ) { + return ParserDescriptor.of(new RegistryEntryParser<>(holderSupplier, registryType), valueType); + } + + // End RegistryType methods + + private static final ArgumentParser RESOURCE_KEY_PARSER = new ResourceKeyParser<>(); + + private final Function, RegistryHolder> holderSupplier; + private final RegistryType registryType; + + /** + * Create a new {@link RegistryEntryParser} using the specified {@link RegistryHolder} function. + * + *

      For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, + * it is suggested to instead use {@link #RegistryEntryParser(DefaultedRegistryType)}.

      + * + * @param holderSupplier registry holder function + * @param registryType registry type + */ + public RegistryEntryParser( + final @NonNull Function, RegistryHolder> holderSupplier, + final @NonNull RegistryType registryType + ) { + this.holderSupplier = holderSupplier; + this.registryType = registryType; + } + + /** + * Create a new {@link RegistryEntryParser}. + * + * @param registryType defaulted registry type + */ + public RegistryEntryParser(final @NonNull DefaultedRegistryType registryType) { + this(ctx -> registryType.defaultHolder().get(), registryType); + } + + private Registry registry(final @NonNull CommandContext commandContext) { + return this.holderSupplier.apply(commandContext).registry(this.registryType); + } + + @SuppressWarnings("unchecked") + @Override + public @NonNull CompletableFuture<@NonNull ArgumentParseResult<@NonNull V>> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return ((ArgumentParser) RESOURCE_KEY_PARSER).parseFuture(commandContext, inputQueue).thenApply(keyResult -> { + if (keyResult.failure().isPresent()) { + return ArgumentParseResult.failure(keyResult.failure().get()); + } + final Optional> entry = this.registry(commandContext).findEntry(keyResult.parsedValue().get()); + if (entry.isPresent()) { + return ArgumentParseResult.success(entry.get().value()); + } + return ArgumentParseResult.failure(new NoSuchEntryException(commandContext, keyResult.parsedValue().get(), this.registryType)); + }); + } + + @Override + public @NonNull List<@NonNull String> stringSuggestions( + final @NonNull CommandContext commandContext, + final @NonNull CommandInput input + ) { + return this.registry(commandContext).streamEntries().flatMap(entry -> { + if (!input.isEmpty() && entry.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + return Stream.of(entry.key().value(), entry.key().asString()); + } + return Stream.of(entry.key().asString()); + }).collect(Collectors.toList()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + if (this.registryType.equals(RegistryTypes.SOUND_TYPE)) { + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() + .completions(CommandCompletionProviders.AVAILABLE_SOUNDS); + } else if (this.registryType.equals(RegistryTypes.BIOME)) { + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() + .completions(CommandCompletionProviders.AVAILABLE_BIOMES); + } else if (this.registryType.equals(RegistryTypes.ENTITY_TYPE)) { + return CommandTreeNodeTypes.ENTITY_SUMMON.get().createNode() + .completions(CommandCompletionProviders.SUMMONABLE_ENTITIES); + } else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { + return CommandTreeNodeTypes.ITEM_ENCHANTMENT.get().createNode(); + } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { + return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); + } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { + return CommandTreeNodeTypes.DIMENSION.get().createNode() + .customCompletions(); // Sponge adds custom types (?) + } + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); + } + + /** + * An exception thrown when there is no entry for the provided {@link ResourceKey} in the resolved registry. + */ + private static final class NoSuchEntryException extends ParserException { + + private static final long serialVersionUID = 4472876671109079272L; + + NoSuchEntryException( + final CommandContext context, + final ResourceKey key, + final RegistryType registryType + ) { + super( + RegistryEntryParser.class, + context, + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, + CaptionVariable.of("id", key.asString()), + CaptionVariable.of("registry", registryType.location().asString()) + ); + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java new file mode 100644 index 00000000..974566cf --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java @@ -0,0 +1,66 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; + +/** + * Argument for parsing {@link ResourceKey ResourceKeys}. + * + * @param sender type + */ +public final class ResourceKeyParser implements NodeSource, ArgumentParser { + + public static ParserDescriptor resourceKeyParser() { + return ParserDescriptor.of(new ResourceKeyParser<>(), ResourceKey.class); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull ResourceKey> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final String input = inputQueue.readString(); + final ResourceKey key = ResourceKeyUtil.resourceKey(input); + if (key == null) { + return ResourceKeyUtil.invalidResourceKey(); + } + return ArgumentParseResult.success(key); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java index c351ddac..444c725c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/ResourceKeyUtil.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.argument; +package cloud.commandframework.sponge.parser; import cloud.commandframework.arguments.parser.ArgumentParseResult; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java new file mode 100644 index 00000000..75ce31e0 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java @@ -0,0 +1,131 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.SingleEntitySelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.Entity; + +/** + * Argument for selecting a single {@link Entity} using a {@link Selector}. + * + * @param sender type + */ +public final class SingleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor singleEntitySelectorParser() { + return ParserDescriptor.of(new SingleEntitySelectorParser<>(), SingleEntitySelector.class); + } + + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.entity()); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final CommandInput originalInput = inputQueue.copy(); + return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { + if (result.failure().isPresent()) { + return ArgumentParseResult.failure(result.failure().get()); + } + final String consumedInput = originalInput.difference(inputQueue); + final EntitySelector parsed = result.parsedValue().get(); + final Entity entity; + try { + entity = (Entity) parsed.findSingleEntity( + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(new SingleEntitySelectorImpl((Selector) parsed, consumedInput, entity)); + }); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.nativeParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ENTITY.get().createNode().single(); + } + + private static final class SingleEntitySelectorImpl implements SingleEntitySelector { + + private final Selector selector; + private final String inputString; + private final Entity result; + + private SingleEntitySelectorImpl( + final Selector selector, + final String inputString, + final Entity result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull Entity getSingle() { + return this.result; + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java new file mode 100644 index 00000000..b466f08e --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java @@ -0,0 +1,134 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import cloud.commandframework.sponge.data.SinglePlayerSelector; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; + +/** + * Argument for selecting a single {@link Player} using a {@link Selector}. + * + * @param sender type + */ +public final class SinglePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor singlePlayerSelectorParser() { + return ParserDescriptor.of(new SinglePlayerSelectorParser<>(), SinglePlayerSelector.class); + } + + private final ArgumentParser nativeParser = new WrappedBrigadierParser<>(EntityArgument.player()); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final CommandInput originalInput = inputQueue.copy(); + return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { + if (result.failure().isPresent()) { + return ArgumentParseResult.failure(result.failure().get()); + } + final String consumedInput = originalInput.difference(inputQueue); + final EntitySelector parsed = result.parsedValue().get(); + final ServerPlayer player; + try { + // todo: a more proper fix then setting permission level 2 + player = (ServerPlayer) parsed.findSinglePlayer( + ((CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE)).withPermission(2) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(new SinglePlayerSelectorImpl((Selector) parsed, consumedInput, player)); + }); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.nativeParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.ENTITY.get().createNode().playersOnly().single(); + } + + + private static final class SinglePlayerSelectorImpl implements SinglePlayerSelector { + + private final Selector selector; + private final String inputString; + private final ServerPlayer result; + + private SinglePlayerSelectorImpl( + final Selector selector, + final String inputString, + final ServerPlayer result + ) { + this.selector = selector; + this.inputString = inputString; + this.result = result; + } + + @Override + public @NonNull Selector selector() { + return this.selector; + } + + @Override + public @NonNull String inputString() { + return this.inputString; + } + + @Override + public @NonNull ServerPlayer getSingle() { + return this.result; + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java new file mode 100644 index 00000000..734f282b --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java @@ -0,0 +1,207 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.captions.Caption; +import cloud.commandframework.captions.CaptionVariable; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.exceptions.parsing.ParserException; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCaptionKeys; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.selector.EntitySelector; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.command.selector.Selector; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.api.user.UserManager; + +/** + * Argument for parsing {@link User} {@link UUID UUIDs} in the {@link UserManager} from + * a {@link Selector}, last known username, or {@link UUID} string. + * + * @param sender type + */ +public final class UserParser implements NodeSource, ArgumentParser, SuggestionProvider { + + public static ParserDescriptor userParser() { + return ParserDescriptor.of(new UserParser<>(), UUID.class); + } + + private final ArgumentParser singlePlayerSelectorParser = + new WrappedBrigadierParser<>(EntityArgument.player()); + + @Override + public @NonNull ArgumentParseResult<@NonNull UUID> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final CommandInput inputCopy = inputQueue.copy(); + final String peek = inputQueue.readString(); + if (peek.startsWith("@")) { + return this.handleSelector(commandContext, inputCopy); + } + + try { + final Optional optionalUser = Sponge.server().gameProfileManager().cache().findByName(peek); + // valid username + if (optionalUser.isPresent()) { + return ArgumentParseResult.success(optionalUser.get().uniqueId()); + } + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.NAME, peek + )); + } catch (final IllegalArgumentException ex) { + // not a valid username + } + + try { + final UUID uuid = UUID.fromString(peek); + // valid uuid + if (Sponge.server().userManager().exists(uuid)) { + return ArgumentParseResult.success(uuid); + } + + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.UUID, peek + )); + } catch (final IllegalArgumentException ex) { + // not a valid uuid + } + + return ArgumentParseResult.failure(new UserNotFoundException( + commandContext, UserNotFoundException.Type.INVALID_INPUT, peek + )); + } + + private @NonNull ArgumentParseResult<@NonNull UUID> handleSelector( + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue + ) { + final ArgumentParseResult result = this.singlePlayerSelectorParser.parse(commandContext, inputQueue); + if (result.failure().isPresent()) { + return ArgumentParseResult.failure(result.failure().get()); + } + final EntitySelector parsed = result.parsedValue().get(); + final ServerPlayer player; + try { + player = (ServerPlayer) parsed.findSinglePlayer( + (CommandSourceStack) commandContext.get(SpongeCommandContextKeys.COMMAND_CAUSE) + ); + } catch (final CommandSyntaxException ex) { + return ArgumentParseResult.failure(ex); + } + return ArgumentParseResult.success(player.uniqueId()); + } + + @Override + public @NonNull CompletableFuture> suggestionsFuture( + final @NonNull CommandContext commandContext, + final @NonNull CommandInput input + ) { + return this.singlePlayerSelectorParser.suggestionProvider().suggestionsFuture(commandContext, input) + .thenApply(it -> { + final List suggestions = new ArrayList<>(); + it.forEach(suggestions::add); + final String peek = input.peekString(); + if (!peek.startsWith("@")) { + suggestions.addAll(Sponge.server().userManager().streamOfMatches(peek) + .filter(GameProfile::hasName) + .map(profile -> profile.name().orElse(null)) + .filter(Objects::nonNull) + .filter(name -> suggestions.stream().noneMatch(s -> s.suggestion().equals(name))) + .map(Suggestion::simple) + .collect(Collectors.toList())); + } + return suggestions; + }); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.GAME_PROFILE.get().createNode().customCompletions(); + } + + /** + * An exception thrown when a {@link User} cannot be found for the provided input. + */ + private static final class UserNotFoundException extends ParserException { + + private static final long serialVersionUID = -24501459406523175L; + + UserNotFoundException( + final CommandContext context, + final @NonNull Type type, + final @NonNull String input + ) { + super( + UserParser.class, + context, + type.caption, + type.variable(input) + ); + } + + private enum Type { + UUID("uuid", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID), + NAME("name", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME), + INVALID_INPUT("input", SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT); + + private final String key; + private final Caption caption; + + Type(final @NonNull String key, final @NonNull Caption caption) { + this.key = key; + this.caption = caption; + } + + CaptionVariable variable(final @NonNull String input) { + return CaptionVariable.of(this.key, input); + } + } + + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java new file mode 100644 index 00000000..edf0f3a6 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java @@ -0,0 +1,104 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import net.minecraft.commands.arguments.coordinates.Vec2Argument; +import net.minecraft.world.phys.Vec3; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.math.vector.Vector2d; + +/** + * Argument for parsing {@link Vector2d} from relative, absolute, or local coordinates. + * + *

      Example input strings:

      + *
        + *
      • {@code ~ ~}
      • + *
      • {@code 0.1 -0.5}
      • + *
      • {@code ~1 ~-2}
      • + *
      + * + * @param sender type + */ +public final class Vector2dParser extends VectorParser { + + public static ParserDescriptor vector2dParser() { + return vector2dParser(false); + } + + public static ParserDescriptor vector2dParser(final boolean centerIntegers) { + return ParserDescriptor.of(new Vector2dParser<>(centerIntegers), Vector2d.class); + } + + private final ArgumentParser mappedParser; + + /** + * Create a new {@link Vector2dParser}. + * + * @param centerIntegers whether to center integers to x.5 + */ + public Vector2dParser(final boolean centerIntegers) { + super(centerIntegers); + this.mappedParser = new WrappedBrigadierParser(new Vec2Argument(centerIntegers)) + .flatMapSuccess((ctx, coordinates) -> { + final Vec3 position = coordinates.getPosition( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) + ); + return ArgumentParseResult.successFuture(new Vector2d(position.x, position.z)); + }); + } + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.VEC2.get().createNode(); + } +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java new file mode 100644 index 00000000..375ccde6 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java @@ -0,0 +1,96 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.ColumnPosArgument; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import net.minecraft.core.BlockPos; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.math.vector.Vector2i; + +/** + * Argument for parsing {@link Vector2i} from relative, absolute, or local coordinates. + * + *

      Example input strings:

      + *
        + *
      • {@code ~ ~}
      • + *
      • {@code 12 -7}
      • + *
      • {@code ^-1 ^0}
      • + *
      • {@code ~-1 ~5}
      • + *
      • {@code ^ ^}
      • + *
      + * + * @param sender type + */ +public final class Vector2iParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor vector2iParser() { + return ParserDescriptor.of(new Vector2iParser<>(), Vector2i.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(ColumnPosArgument.columnPos()) + .flatMapSuccess((ctx, coordinates) -> { + final BlockPos pos = coordinates.getBlockPos( + (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE) + ); + return ArgumentParseResult.successFuture(new Vector2i(pos.getX(), pos.getZ())); + }); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.COLUMN_POS.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java new file mode 100644 index 00000000..7057c357 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java @@ -0,0 +1,105 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import net.minecraft.commands.arguments.coordinates.Vec3Argument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.common.util.VecHelper; +import org.spongepowered.math.vector.Vector3d; + +/** + * Argument for parsing {@link Vector3d} from relative, absolute, or local coordinates. + * + *

      Example input strings:

      + *
        + *
      • {@code ~ ~ ~}
      • + *
      • {@code 0.1 -0.5 .9}
      • + *
      • {@code ~1 ~-2 ~10}
      • + *
      • {@code ^1 ^ ^-5}
      • + *
      + * + * @param sender type + */ +public final class Vector3dParser extends VectorParser { + + public static ParserDescriptor vector3dParser() { + return vector3dParser(false); + } + + public static ParserDescriptor vector3dParser(final boolean centerIntegers) { + return ParserDescriptor.of(new Vector3dParser<>(centerIntegers), Vector3d.class); + } + + private final ArgumentParser mappedParser; + + /** + * Create a new {@link Vector3dParser}. + * + * @param centerIntegers whether to center integers to x.5 + */ + public Vector3dParser(final boolean centerIntegers) { + super(centerIntegers); + this.mappedParser = new WrappedBrigadierParser(new Vec3Argument(centerIntegers)) + .flatMapSuccess((ctx, coordinates) -> { + return ArgumentParseResult.successFuture(VecHelper.toVector3d( + coordinates.getPosition((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) + )); + }); + } + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.VEC3.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java new file mode 100644 index 00000000..c6f76920 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java @@ -0,0 +1,94 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import cloud.commandframework.sponge.SpongeCommandContextKeys; +import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.commands.arguments.coordinates.Coordinates; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.common.util.VecHelper; +import org.spongepowered.math.vector.Vector3i; + +/** + * Argument for parsing {@link Vector3i} from relative, absolute, or local coordinates. + * + *

      Example input strings:

      + *
        + *
      • {@code ~ ~ ~}
      • + *
      • {@code 1 1 1}
      • + *
      • {@code ~0.5 ~-2 ~10}
      • + *
      • {@code ^1 ^ ^-5}
      • + *
      + * + * @param sender type + */ +public final class Vector3iParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + public static ParserDescriptor vector3iParser() { + return ParserDescriptor.of(new Vector3iParser<>(), Vector3i.class); + } + + private final ArgumentParser mappedParser = + new WrappedBrigadierParser(BlockPosArgument.blockPos()) + .flatMapSuccess((ctx, coordinates) -> { + return ArgumentParseResult.successFuture(VecHelper.toVector3i( + coordinates.getBlockPos((CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE)) + )); + }); + + @Override + public @NonNull CompletableFuture> parseFuture( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + return this.mappedParser.parseFuture(commandContext, inputQueue); + } + + @Override + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { + return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.BLOCK_POS.get().createNode(); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java similarity index 52% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java index 6bcc6ca7..d1fb88e1 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/argument/package-info.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2022 Alexander Söderberg & Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -21,7 +21,35 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.suggestion.SuggestionProvider; +import cloud.commandframework.sponge.NodeSource; + /** - * Arguments for the Sponge 8 environment. + * Parent of {@link Vector3dParser} and {@link Vector2dParser} containing shared methods. + * + *

      Not for extension by API users.

      + * + * @param sender type + * @param vector type */ -package cloud.commandframework.sponge.argument; +public abstract class VectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + + private final boolean centerIntegers; + + protected VectorParser(final boolean centerIntegers) { + this.centerIntegers = centerIntegers; + } + + /** + * Get whether integers will be centered to x.5. Defaults to false. + * + * @return whether integers will be centered + */ + public final boolean centerIntegers() { + return this.centerIntegers; + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java new file mode 100644 index 00000000..f6fcf19d --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -0,0 +1,112 @@ +// +// MIT License +// +// Copyright (c) 2022 Alexander Söderberg & Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.parser; + +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.ParserDescriptor; +import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; +import cloud.commandframework.context.CommandContext; +import cloud.commandframework.context.CommandInput; +import cloud.commandframework.sponge.NodeSource; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import net.minecraft.commands.arguments.DimensionArgument; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.registrar.tree.CommandTreeNode; +import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; +import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.api.world.server.WorldManager; + +/** + * Argument for retrieving {@link ServerWorld ServerWorlds} from the {@link WorldManager} by their {@link ResourceKey}. + * + * @param sender type + */ +public final class WorldParser implements ArgumentParser, NodeSource, BlockingSuggestionProvider.Strings { + + public static ParserDescriptor worldParser() { + return ParserDescriptor.of(new WorldParser<>(), ServerWorld.class); + } + + private static final DynamicCommandExceptionType ERROR_INVALID_VALUE; + + static { + try { + // ERROR_INVALID_VALUE (todo: use accessor) + final Field errorInvalidValueField = Arrays.stream(DimensionArgument.class.getDeclaredFields()) + .filter(f -> f.getType().equals(DynamicCommandExceptionType.class)) + .findFirst() + .orElseThrow(IllegalStateException::new); + errorInvalidValueField.setAccessible(true); + ERROR_INVALID_VALUE = (DynamicCommandExceptionType) errorInvalidValueField.get(null); + } catch (final Exception ex) { + throw new RuntimeException("Couldn't access ERROR_INVALID_VALUE command exception type.", ex); + } + } + + @Override + public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( + @NonNull final CommandContext<@NonNull C> commandContext, + @NonNull final CommandInput inputQueue + ) { + final String input = inputQueue.readString(); + final ResourceKey key = ResourceKeyUtil.resourceKey(input); + if (key == null) { + return ResourceKeyUtil.invalidResourceKey(); + } + final Optional entry = Sponge.server().worldManager().world(key); + if (entry.isPresent()) { + return ArgumentParseResult.success(entry.get()); + } + return ArgumentParseResult.failure(ERROR_INVALID_VALUE.create(key)); + } + + @Override + public @NonNull List<@NonNull String> stringSuggestions( + final @NonNull CommandContext commandContext, + final @NonNull CommandInput input + ) { + return Sponge.server().worldManager().worlds().stream().flatMap(world -> { + if (!input.isEmpty() && world.key().namespace().equals(ResourceKey.MINECRAFT_NAMESPACE)) { + return Stream.of(world.key().value(), world.key().asString()); + } + return Stream.of(world.key().asString()); + }).collect(Collectors.toList()); + } + + @Override + public CommandTreeNode.@NonNull Argument> node() { + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode().customCompletions(); + } + +} + diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java new file mode 100644 index 00000000..637c61f3 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java @@ -0,0 +1,4 @@ +/** + * Parsers for the Sponge 8 environment. + */ +package cloud.commandframework.sponge.parser; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 3d587ce4..f8502c35 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -23,27 +23,16 @@ // package cloud.commandframework.examples.sponge; -import cloud.commandframework.ArgumentDescription; import cloud.commandframework.Command; +import cloud.commandframework.Description; +import cloud.commandframework.arguments.DefaultValue; +import cloud.commandframework.arguments.standard.StringParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.execution.ExecutionCoordinator; import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; +import cloud.commandframework.permission.PredicatePermission; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; -import cloud.commandframework.sponge.argument.BlockInputArgument; -import cloud.commandframework.sponge.argument.BlockPredicateArgument; -import cloud.commandframework.sponge.argument.DataContainerArgument; -import cloud.commandframework.sponge.argument.ItemStackPredicateArgument; -import cloud.commandframework.sponge.argument.MultipleEntitySelectorArgument; -import cloud.commandframework.sponge.argument.NamedTextColorArgument; -import cloud.commandframework.sponge.argument.OperatorArgument; -import cloud.commandframework.sponge.argument.ProtoItemStackArgument; -import cloud.commandframework.sponge.argument.RegistryEntryArgument; -import cloud.commandframework.sponge.argument.SinglePlayerSelectorArgument; -import cloud.commandframework.sponge.argument.UserArgument; -import cloud.commandframework.sponge.argument.Vector3dArgument; -import cloud.commandframework.sponge.argument.Vector3iArgument; -import cloud.commandframework.sponge.argument.WorldArgument; import cloud.commandframework.sponge.data.BlockInput; import cloud.commandframework.sponge.data.BlockPredicate; import cloud.commandframework.sponge.data.ItemStackPredicate; @@ -94,6 +83,24 @@ import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.builtin.jvm.Plugin; +import static cloud.commandframework.arguments.standard.DoubleParser.doubleParser; +import static cloud.commandframework.arguments.standard.IntegerParser.integerParser; +import static cloud.commandframework.arguments.standard.StringParser.greedyStringParser; +import static cloud.commandframework.arguments.standard.StringParser.stringParser; +import static cloud.commandframework.sponge.parser.BlockInputParser.blockInputParser; +import static cloud.commandframework.sponge.parser.BlockPredicateParser.blockPredicateParser; +import static cloud.commandframework.sponge.parser.DataContainerParser.dataContainerParser; +import static cloud.commandframework.sponge.parser.ItemStackPredicateParser.itemStackPredicateParser; +import static cloud.commandframework.sponge.parser.MultipleEntitySelectorParser.multipleEntitySelectorParser; +import static cloud.commandframework.sponge.parser.NamedTextColorParser.namedTextColorParser; +import static cloud.commandframework.sponge.parser.OperatorParser.operatorParser; +import static cloud.commandframework.sponge.parser.ProtoItemStackParser.protoItemStackParser; +import static cloud.commandframework.sponge.parser.RegistryEntryParser.registryEntryParser; +import static cloud.commandframework.sponge.parser.SinglePlayerSelectorParser.singlePlayerSelectorParser; +import static cloud.commandframework.sponge.parser.UserParser.userParser; +import static cloud.commandframework.sponge.parser.Vector3dParser.vector3dParser; +import static cloud.commandframework.sponge.parser.Vector3iParser.vector3iParser; +import static cloud.commandframework.sponge.parser.WorldParser.worldParser; import static net.kyori.adventure.text.Component.newline; import static net.kyori.adventure.text.Component.space; import static net.kyori.adventure.text.Component.text; @@ -109,11 +116,11 @@ public final class CloudExamplePlugin { private static final Component COMMAND_PREFIX = text() - .color(color(0x333333)) - .content("[") - .append(text("Cloud-Sponge", color(0xF7CF0D))) - .append(text(']')) - .build(); + .color(color(0x333333)) + .content("[") + .append(text("Cloud-Sponge", color(0xF7CF0D))) + .append(text(']')) + .build(); private final SpongeCommandManager commandManager; @@ -126,322 +133,318 @@ public final class CloudExamplePlugin { public CloudExamplePlugin(final @NonNull Injector injector) { // Create child injector with cloud module final Injector childInjector = injector.createChildInjector( - CloudInjectionModule.createNative(ExecutionCoordinator.simpleCoordinator()) + CloudInjectionModule.createNative(ExecutionCoordinator.simpleCoordinator()) ); // Get command manager instance - this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral>() { - })); + this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral>() {})); // Use Cloud's enhanced number suggestions this.commandManager.parserMapper().cloudNumberSuggestions(true); // Register minecraft-extras exception handlers MinecraftExceptionHandler.create(CommandCause::audience) - .defaultHandlers() - .decorator(message -> Component.text().append(COMMAND_PREFIX, space(), message).build()) - .registerTo(this.commandManager); + .defaultHandlers() + .decorator(message -> Component.text().append(COMMAND_PREFIX, space(), message).build()) + .registerTo(this.commandManager); this.registerCommands(); } private void registerCommands() { this.commandManager.command(this.commandManager.commandBuilder("cloud_test1") - .permission("cloud.test1") - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + .permission("cloud.test1") + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(this.commandManager.commandBuilder("cloud_test2") - .literal("test") - .literal("test1") - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + .literal("test") + .literal("test1") + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); final Command.Builder cloudTest3 = this.commandManager.commandBuilder("cloud_test3"); final Command.Builder test = cloudTest3.literal("test"); - this.commandManager.command(test.argument(StringArgument.single("string_arg")) - .literal("test2") - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + this.commandManager.command(test.required("string_arg", stringParser()) + .literal("test2") + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(test.literal("literal_arg") - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(cloudTest3.literal("another_test") - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); final Command.Builder cloud = this.commandManager.commandBuilder("cloud"); this.commandManager.command(cloud.literal("string_test") - .argument(StringArgument.single("single")) - .argument(StringArgument.quoted("quoted")) - .argument(StringArgument.greedy("greedy")) - .handler(ctx -> ctx.getSender().audience().sendMessage(text("success")))); + .required("single", stringParser(StringParser.StringMode.SINGLE)) + .required("quoted", stringParser(StringParser.StringMode.QUOTED)) + .required("greedy", stringParser(StringParser.StringMode.GREEDY)) + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(cloud.literal("int_test") - .argument(IntegerArgument.of("any")) - .argument(IntegerArgument.newBuilder("gt0").withMin(1)) - .argument(IntegerArgument.newBuilder("lt100").withMax(99)) - .argument(IntegerArgument.newBuilder("5to20").withMin(5).withMax(20)) - .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); + .required("any", integerParser()) + .required("gt0", integerParser(1)) + .required("lt100", integerParser(Integer.MIN_VALUE, 99)) + .required("5to20", integerParser(5, 20)) + .handler(ctx -> ctx.sender().audience().sendMessage(text("success")))); this.commandManager.command(cloud.literal("enchantment_type_test") - .argument(RegistryEntryArgument.of("enchantment_type", EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) - .argument(IntegerArgument.optional("level", 1)) - .handler(ctx -> { - final Object subject = ctx.sender().subject(); - if (!(subject instanceof Player)) { - ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); - return; - } - final Player player = (Player) subject; - final Hotbar hotbar = player.inventory().hotbar(); - final int index = hotbar.selectedSlotIndex(); - final Slot slot = hotbar.slot(index).get(); - final InventoryTransactionResult.Poll result = slot.poll(); - if (result.type() != InventoryTransactionResult.Type.SUCCESS) { - player.sendMessage(text("You must hold an item to enchant!", RED)); - return; - } - final ItemStack modified = ItemStack.builder() - .fromItemStack(result.polledItem().createStack()) - .add(Keys.APPLIED_ENCHANTMENTS, ImmutableList.of( - Enchantment.of( - ctx.get("enchantment_type"), - ctx.get("level") - ) - )) - .build(); - slot.set(modified); - })); + .required("enchantment_type", registryEntryParser(EnchantmentType.class, RegistryTypes.ENCHANTMENT_TYPE)) + .optional("level", integerParser(), DefaultValue.constant(1)) + .handler(ctx -> { + final Object subject = ctx.sender().subject(); + if (!(subject instanceof Player)) { + ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); + return; + } + final Player player = (Player) subject; + final Hotbar hotbar = player.inventory().hotbar(); + final int index = hotbar.selectedSlotIndex(); + final Slot slot = hotbar.slot(index).get(); + final InventoryTransactionResult.Poll result = slot.poll(); + if (result.type() != InventoryTransactionResult.Type.SUCCESS) { + player.sendMessage(text("You must hold an item to enchant!", RED)); + return; + } + final ItemStack modified = ItemStack.builder() + .fromItemStack(result.polledItem().createStack()) + .add(Keys.APPLIED_ENCHANTMENTS, ImmutableList.of( + Enchantment.of( + ctx.get("enchantment_type"), + ctx.get("level") + ) + )) + .build(); + slot.set(modified); + })); this.commandManager.command(cloud.literal("color_test") - .argument(NamedTextColorArgument.of("color")) - .argument(StringArgument.greedy("message")) - .handler(ctx -> { - ctx.sender().audience().sendMessage( - text(ctx.get("message"), ctx.get("color")) - ); - })); + .required("color", namedTextColorParser()) + .required("message", greedyStringParser()) + .handler(ctx -> { + ctx.sender().audience().sendMessage( + text(ctx.get("message"), ctx.get("color")) + ); + })); this.commandManager.command(cloud.literal("operator_test") - .argument(IntegerArgument.of("first")) - .argument(OperatorArgument.of("operator")) - .argument(IntegerArgument.of("second")) - .handler(ctx -> { - final int first = ctx.get("first"); - final int second = ctx.get("second"); - final Operator operator = ctx.get("operator"); - if (!(operator instanceof Operator.Simple)) { - ctx.sender().audience().sendMessage( - text("That type of operator is not applicable here!", RED) - ); - return; - } - ctx.sender().audience().sendMessage(text() - .color(AQUA) - .append(text(first)) - .append(space()) - .append(text(operator.asString(), BLUE)) - .append(space()) - .append(text(second)) - .append(space()) - .append(text('→', BLUE)) - .append(space()) - .append(text(((Operator.Simple) operator).apply(first, second))) + .required("first", integerParser()) + .required("operator", operatorParser()) + .required("second", integerParser()) + .handler(ctx -> { + final int first = ctx.get("first"); + final int second = ctx.get("second"); + final Operator operator = ctx.get("operator"); + if (!(operator instanceof Operator.Simple)) { + ctx.sender().audience().sendMessage( + text("That type of operator is not applicable here!", RED) ); - })); + return; + } + ctx.sender().audience().sendMessage(text() + .color(AQUA) + .append(text(first)) + .append(space()) + .append(text(operator.asString(), BLUE)) + .append(space()) + .append(text(second)) + .append(space()) + .append(text('→', BLUE)) + .append(space()) + .append(text(((Operator.Simple) operator).apply(first, second))) + ); + })); this.commandManager.command(cloud.literal("modifylevel") - .argument(OperatorArgument.of("operator")) - .argument(DoubleArgument.of("value")) - .handler(ctx -> { - final Object subject = ctx.sender().subject(); - if (!(subject instanceof Player)) { // todo: a solution to this - ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); - return; - } - final Player player = (Player) subject; - final Operator operator = ctx.get("operator"); - final double value = ctx.get("value"); - if (operator == Operators.ASSIGN.get()) { - player.offer(Keys.EXPERIENCE, (int) value); - return; - } - if (!(operator instanceof Operator.Simple)) { - ctx.sender().audience().sendMessage( - text("That type of operator is not applicable here!", RED) - ); - return; - } - final int currentXp = player.get(Keys.EXPERIENCE).get(); - player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); - })); + .required("operator", operatorParser()) + .required("value", doubleParser()) + .handler(ctx -> { + final Object subject = ctx.sender().subject(); + if (!(subject instanceof Player)) { // todo: a solution to this + ctx.sender().audience().sendMessage(text("This command is for players only!", RED)); + return; + } + final Player player = (Player) subject; + final Operator operator = ctx.get("operator"); + final double value = ctx.get("value"); + if (operator == Operators.ASSIGN.get()) { + player.offer(Keys.EXPERIENCE, (int) value); + return; + } + if (!(operator instanceof Operator.Simple)) { + ctx.sender().audience().sendMessage( + text("That type of operator is not applicable here!", RED) + ); + return; + } + final int currentXp = player.get(Keys.EXPERIENCE).get(); + player.offer(Keys.EXPERIENCE, (int) ((Operator.Simple) operator).apply(currentXp, value)); + })); this.commandManager.command(cloud.literal("selectplayer") - .argument(SinglePlayerSelectorArgument.of("player")) - .handler(ctx -> { - final Player player = ctx.get("player").getSingle(); - ctx.sender().audience().sendMessage(Component.text().append( - text("Display name of selected player: ", GRAY), - player.displayName().get() - ).build()); - })); + .required("player", singlePlayerSelectorParser()) + .handler(ctx -> { + final Player player = ctx.get("player").getSingle(); + ctx.sender().audience().sendMessage(Component.text().append( + text("Display name of selected player: ", GRAY), + player.displayName().get() + ).build()); + })); this.commandManager.command(cloud.literal("world_test") - .argument(WorldArgument.of("world")) - .handler(ctx -> { - ctx.sender().audience().sendMessage(text(ctx.get("world").key().asString())); - })); + .required("world", worldParser()) + .handler(ctx -> { + ctx.sender().audience().sendMessage(text(ctx.get("world").key().asString())); + })); this.commandManager.command(cloud.literal("test_item") - .argument(ProtoItemStackArgument.of("item")) - .literal("is") - .argument(ItemStackPredicateArgument.of("predicate")) - .handler(ctx -> { - final ItemStack item = ctx.get("item").createItemStack(1, true); - final ItemStackPredicate predicate = ctx.get("predicate"); - final Component message = text(builder -> { - builder.append(item.get(Keys.DISPLAY_NAME).orElse(item.type().asComponent())) - .append(space()); - if (predicate.test(item)) { - builder.append(text("passes!", GREEN)); - return; - } - builder.append(text("does not pass!", RED)); - }); - ctx.sender().audience().sendMessage(message); - })); + .required("item", protoItemStackParser()) + .literal("is") + .required("predicate", itemStackPredicateParser()) + .handler(ctx -> { + final ItemStack item = ctx.get("item").createItemStack(1, true); + final ItemStackPredicate predicate = ctx.get("predicate"); + final Component message = text(builder -> { + builder.append(item.get(Keys.DISPLAY_NAME).orElse(item.type().asComponent())) + .append(space()); + if (predicate.test(item)) { + builder.append(text("passes!", GREEN)); + return; + } + builder.append(text("does not pass!", RED)); + }); + ctx.sender().audience().sendMessage(message); + })); this.commandManager.command(cloud.literal("test_entity_type") - .argument(RegistryEntryArgument.of("type", new TypeToken>() { - }, RegistryTypes.ENTITY_TYPE)) - .handler(ctx -> { - ctx.sender().audience().sendMessage(ctx.>get("type")); - })); - final Function, RegistryHolder> holderFunction = ctx -> ctx.getSender() - .location() - .map(Location::world) - .orElse(Sponge.server().worldManager().defaultWorld()); + .required("type", registryEntryParser(new TypeToken<>() {}, RegistryTypes.ENTITY_TYPE)) + .handler(ctx -> ctx.sender().audience().sendMessage(ctx.>get("type")))); + final Function, RegistryHolder> holderFunction = ctx -> ctx.sender() + .location() + .map(Location::world) + .orElse(Sponge.server().worldManager().defaultWorld()); this.commandManager.command(cloud.literal("test_biomes") - .argument(RegistryEntryArgument.of("biome", Biome.class, holderFunction, RegistryTypes.BIOME)) - .handler(ctx -> { - final ResourceKey biomeKey = holderFunction.apply(ctx) - .registry(RegistryTypes.BIOME) - .findValueKey(ctx.get("biome")) - .orElseThrow(IllegalStateException::new); - ctx.sender().audience().sendMessage(text(biomeKey.asString())); - })); + .required("biome", registryEntryParser(Biome.class, RegistryTypes.BIOME, holderFunction)) + .handler(ctx -> { + final ResourceKey biomeKey = holderFunction.apply(ctx) + .registry(RegistryTypes.BIOME) + .findValueKey(ctx.get("biome")) + .orElseThrow(IllegalStateException::new); + ctx.sender().audience().sendMessage(text(biomeKey.asString())); + })); this.commandManager.command(cloud.literal("test_sounds") - .argument(RegistryEntryArgument.of("type", SoundType.class, RegistryTypes.SOUND_TYPE)) - .handler(ctx -> { - ctx.sender().audience().sendMessage(text(ctx.get("type").key().asString())); - })); + .required("type", registryEntryParser(SoundType.class, RegistryTypes.SOUND_TYPE)) + .handler(ctx -> { + ctx.sender().audience().sendMessage(text(ctx.get("type").key().asString())); + })); this.commandManager.command(cloud.literal("summon_villager") - .argument(RegistryEntryArgument.of("type", VillagerType.class, RegistryTypes.VILLAGER_TYPE)) - .argument(RegistryEntryArgument.of("profession", ProfessionType.class, RegistryTypes.PROFESSION_TYPE)) - .handler(ctx -> { - final ServerLocation loc = ctx.sender().location().orElse(null); - if (loc == null) { - ctx.sender().audience().sendMessage(text("No location!")); - return; - } - final ServerWorld world = loc.world(); - final Villager villager = world.createEntity(EntityTypes.VILLAGER, loc.position()); - villager.offer(Keys.VILLAGER_TYPE, ctx.get("type")); - villager.offer(Keys.PROFESSION_TYPE, ctx.get("profession")); - if (world.spawnEntity(villager)) { - ctx.sender().audience().sendMessage(text() - .append(text("Spawned entity!", GREEN)) - .append(space()) - .append(villager.displayName().get()) - .hoverEvent(villager)); - } else { - ctx.sender().audience().sendMessage(text("failed to spawn :(")); - } - })); + .required("type", registryEntryParser(VillagerType.class, RegistryTypes.VILLAGER_TYPE)) + .required("profession", registryEntryParser(ProfessionType.class, RegistryTypes.PROFESSION_TYPE)) + .handler(ctx -> { + final ServerLocation loc = ctx.sender().location().orElse(null); + if (loc == null) { + ctx.sender().audience().sendMessage(text("No location!")); + return; + } + final ServerWorld world = loc.world(); + final Villager villager = world.createEntity(EntityTypes.VILLAGER, loc.position()); + villager.offer(Keys.VILLAGER_TYPE, ctx.get("type")); + villager.offer(Keys.PROFESSION_TYPE, ctx.get("profession")); + if (world.spawnEntity(villager)) { + ctx.sender().audience().sendMessage(text() + .append(text("Spawned entity!", GREEN)) + .append(space()) + .append(villager.displayName().get()) + .hoverEvent(villager)); + } else { + ctx.sender().audience().sendMessage(text("failed to spawn :(")); + } + })); this.commandManager.command(cloud.literal("vec3d") - .argument(Vector3dArgument.of("vec3d")) - .handler(ctx -> { - ctx.sender().audience().sendMessage(text(ctx.get("vec3d").toString())); - })); + .required("vec3d", vector3dParser()) + .handler(ctx -> { + ctx.sender().audience().sendMessage(text(ctx.get("vec3d").toString())); + })); this.commandManager.command(cloud.literal("selectentities") - .argument(MultipleEntitySelectorArgument.of("selector")) - .handler(ctx -> { - final MultipleEntitySelector selector = ctx.get("selector"); - ctx.sender().audience().sendMessage(Component.text().append( - text("Using selector: ", BLUE), - text(selector.inputString()), - newline(), - text("Selected: ", LIGHT_PURPLE), - selector.get().stream() - .map(e -> e.displayName().get()) - .collect(Component.toComponent(text(", ", GRAY))) - ).build()); - })); + .required("selector", multipleEntitySelectorParser()) + .handler(ctx -> { + final MultipleEntitySelector selector = ctx.get("selector"); + ctx.sender().audience().sendMessage(Component.text().append( + text("Using selector: ", BLUE), + text(selector.inputString()), + newline(), + text("Selected: ", LIGHT_PURPLE), + selector.get().stream() + .map(e -> e.displayName().get()) + .collect(Component.toComponent(text(", ", GRAY))) + ).build()); + })); this.commandManager.command(cloud.literal("user") - .argument(UserArgument.of("user")) - .handler(ctx -> { - ctx.sender().audience().sendMessage(text(ctx.get("user").toString())); - })); + .required("user", userParser()) + .handler(ctx -> { + ctx.sender().audience().sendMessage(text(ctx.get("user").toString())); + })); this.commandManager.command(cloud.literal("data") - .argument(DataContainerArgument.of("data")) - .handler(ctx -> { - ctx.sender().audience().sendMessage(text(ctx.get("data").toString())); - })); + .required("data", dataContainerParser()) + .handler(ctx -> { + ctx.sender().audience().sendMessage(text(ctx.get("data").toString())); + })); this.commandManager.command(cloud.literal("setblock") - .permission("cloud.setblock") - .argument(Vector3iArgument.of("position")) - .argument(BlockInputArgument.of("block")) - .handler(ctx -> { - final Vector3i position = ctx.get("position"); - final BlockInput input = ctx.get("block"); - final Optional location = ctx.sender().location(); - if (location.isPresent()) { - final ServerWorld world = location.get().world(); - input.place(world.location(position)); - ctx.sender().audience().sendMessage(text("set block!")); - } else { - ctx.sender().audience().sendMessage(text("no location!")); - } - })); + .permission("cloud.setblock") + .required("position", vector3iParser()) + .required("block", blockInputParser()) + .handler(ctx -> { + final Vector3i position = ctx.get("position"); + final BlockInput input = ctx.get("block"); + final Optional location = ctx.sender().location(); + if (location.isPresent()) { + final ServerWorld world = location.get().world(); + input.place(world.location(position)); + ctx.sender().audience().sendMessage(text("set block!")); + } else { + ctx.sender().audience().sendMessage(text("no location!")); + } + })); this.commandManager.command(cloud.literal("blockinput") - .argument(BlockInputArgument.of("block")) - .handler(ctx -> { - final BlockInput input = ctx.get("block"); - ctx.sender().audience().sendMessage(text( - PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() - .apply(RegistryTypes.BLOCK_TYPE.get(), input.blockState()) - )); - })); + .required("block", blockInputParser()) + .handler(ctx -> { + final BlockInput input = ctx.get("block"); + ctx.sender().audience().sendMessage(text( + PaletteTypes.BLOCK_STATE_PALETTE.get().stringifier() + .apply(RegistryTypes.BLOCK_TYPE.get(), input.blockState()) + )); + })); this.commandManager.command(this.commandManager.commandBuilder("gib") - .permission("cloud.gib") - .argumentPair( - "itemstack", - TypeToken.get(ItemStack.class), - Pair.of("item", "amount"), - Pair.of(ProtoItemStack.class, Integer.class), - (sender, pair) -> { - final ProtoItemStack proto = pair.getFirst(); - final int amount = pair.getSecond(); - return proto.createItemStack(amount, true); - }, - ArgumentDescription.of("The ItemStack to give") - ) - .handler(ctx -> ((Player) ctx.getSender().subject()).inventory().offer(ctx.get("itemstack")))); + .permission("cloud.gib") + .requiredArgumentPair( + "itemstack", + TypeToken.get(ItemStack.class), + Pair.of("item", "amount"), + Pair.of(ProtoItemStack.class, Integer.class), + (sender, pair) -> { + final ProtoItemStack proto = pair.first(); + final int amount = pair.second(); + return proto.createItemStack(amount, true); + }, + Description.of("The ItemStack to give") + ) + .handler(ctx -> ((Player) ctx.sender().subject()).inventory().offer(ctx.get("itemstack")))); this.commandManager.command(cloud.literal("replace") - .permission(cause -> { - // works but error message is ugly - // todo: cause.cause().root() returns DedicatedServer during permission checks? - return cause.subject() instanceof Player; - }) - .argument(BlockPredicateArgument.of("predicate")) - .argument(IntegerArgument.of("radius")) - .argument(BlockInputArgument.of("replacement")) - .handler(ctx -> { - final BlockPredicate predicate = ctx.get("predicate"); - final int radius = ctx.get("radius"); - final BlockInput replacement = ctx.get("replacement"); + .permission(PredicatePermission.of(cause -> { + // works but error message is ugly + // todo: cause.cause().root() returns DedicatedServer during permission checks? + return cause.subject() instanceof Player; + })) + .required("predicate", blockPredicateParser()) + .required("radius", integerParser()) + .required("replacement", blockInputParser()) + .handler(ctx -> { + final BlockPredicate predicate = ctx.get("predicate"); + final int radius = ctx.get("radius"); + final BlockInput replacement = ctx.get("replacement"); - // its a player so get is fine - final ServerLocation loc = ctx.sender().location().get(); - final ServerWorld world = loc.world(); - final Vector3d vec = loc.position(); + // its a player so get is fine + final ServerLocation loc = ctx.sender().location().get(); + final ServerWorld world = loc.world(); + final Vector3d vec = loc.position(); - for (double x = vec.x() - radius; x < vec.x() + radius; x++) { - for (double y = vec.y() - radius; y < vec.y() + radius; y++) { - for (double z = vec.z() - radius; z < vec.z() + radius; z++) { - final ServerLocation location = world.location(x, y, z); - if (predicate.test(location)) { - location.setBlock(replacement.blockState()); - } + for (double x = vec.x() - radius; x < vec.x() + radius; x++) { + for (double y = vec.y() - radius; y < vec.y() + radius; y++) { + for (double z = vec.z() - radius; z < vec.z() + radius; z++) { + final ServerLocation location = world.location(x, y, z); + if (predicate.test(location)) { + location.setBlock(replacement.blockState()); } } } - })); + } + })); } } From a215eaea36651f523d02ae48aaffc4d71592a4b3 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 10:58:45 -0700 Subject: [PATCH 52/72] spotlessApply --- .../cloud/commandframework/sponge/CloudInjectionModule.java | 2 +- .../java/cloud/commandframework/sponge/CloudSpongeCommand.java | 2 +- .../main/java/cloud/commandframework/sponge/NodeSource.java | 2 +- .../java/cloud/commandframework/sponge/SpongeCaptionKeys.java | 2 +- .../cloud/commandframework/sponge/SpongeCaptionRegistry.java | 2 +- .../commandframework/sponge/SpongeCommandContextKeys.java | 2 +- .../cloud/commandframework/sponge/SpongeCommandManager.java | 2 +- .../commandframework/sponge/SpongeCommandPreprocessor.java | 2 +- .../java/cloud/commandframework/sponge/SpongeParserMapper.java | 2 +- .../cloud/commandframework/sponge/SpongeParserParameters.java | 2 +- .../commandframework/sponge/SpongeRegistrationHandler.java | 2 +- .../commandframework/sponge/annotation/specifier/Center.java | 2 +- .../java/cloud/commandframework/sponge/data/BlockInput.java | 2 +- .../cloud/commandframework/sponge/data/BlockPredicate.java | 2 +- .../commandframework/sponge/data/GameProfileCollection.java | 2 +- .../cloud/commandframework/sponge/data/ItemStackPredicate.java | 2 +- .../commandframework/sponge/data/MultipleEntitySelector.java | 2 +- .../commandframework/sponge/data/MultiplePlayerSelector.java | 2 +- .../cloud/commandframework/sponge/data/ProtoItemStack.java | 2 +- .../cloud/commandframework/sponge/data/SelectorWrapper.java | 2 +- .../commandframework/sponge/data/SingleEntitySelector.java | 2 +- .../commandframework/sponge/data/SinglePlayerSelector.java | 2 +- .../sponge/exception/ComponentMessageRuntimeException.java | 2 +- .../cloud/commandframework/sponge/parser/BlockInputParser.java | 2 +- .../commandframework/sponge/parser/BlockPredicateParser.java | 2 +- .../cloud/commandframework/sponge/parser/ComponentParser.java | 2 +- .../commandframework/sponge/parser/DataContainerParser.java | 2 +- .../sponge/parser/GameProfileCollectionParser.java | 2 +- .../commandframework/sponge/parser/GameProfileParser.java | 2 +- .../sponge/parser/ItemStackPredicateParser.java | 2 +- .../sponge/parser/MultipleEntitySelectorParser.java | 2 +- .../sponge/parser/MultiplePlayerSelectorParser.java | 2 +- .../commandframework/sponge/parser/NamedTextColorParser.java | 2 +- .../cloud/commandframework/sponge/parser/OperatorParser.java | 2 +- .../commandframework/sponge/parser/ProtoItemStackParser.java | 2 +- .../commandframework/sponge/parser/RegistryEntryParser.java | 2 +- .../commandframework/sponge/parser/ResourceKeyParser.java | 2 +- .../cloud/commandframework/sponge/parser/ResourceKeyUtil.java | 2 +- .../sponge/parser/SingleEntitySelectorParser.java | 2 +- .../sponge/parser/SinglePlayerSelectorParser.java | 2 +- .../java/cloud/commandframework/sponge/parser/UserParser.java | 2 +- .../cloud/commandframework/sponge/parser/Vector2dParser.java | 2 +- .../cloud/commandframework/sponge/parser/Vector2iParser.java | 2 +- .../cloud/commandframework/sponge/parser/Vector3dParser.java | 2 +- .../cloud/commandframework/sponge/parser/Vector3iParser.java | 2 +- .../cloud/commandframework/sponge/parser/VectorParser.java | 2 +- .../java/cloud/commandframework/sponge/parser/WorldParser.java | 3 +-- 47 files changed, 47 insertions(+), 48 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index e74043c8..4b673a0c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 7c25cf92..bbac0e99 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java index 7fbd3565..a69957d5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index 68fb7d6c..97d275d3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java index 7806f837..55c179c9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index 89162c7c..c3e2f5eb 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index e45bde68..9f67fa47 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index d8ec686d..518913e4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index ce6dd582..df3e13e4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java index 8f31a2ae..45cbf6db 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 658c6c7b..a0bb8f05 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java index 5254baf7..7200b904 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java index f82931df..10c0a51c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java index 410ff6b3..7478bfc4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java index 7feb28b0..0cd9f30e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java index d86661ea..00ae457c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java index 6f945dc9..28eceb85 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java index 9d83b1cd..7d45b52b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java index 667669d7..862e351b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java index a9702da0..3e64d994 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java index a41edced..2773863e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java index 74fd192b..46523c8d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java index 18e9892d..4769bbc9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index c61231d1..cd21b9fc 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index cb9250f2..f8490e85 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java index 98fe06cd..a7e023d4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java index 86befb5b..34ad6d3c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java index 1e86d244..2e3c650c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java index 51868453..e8e4c565 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index b91eac4d..ddc5d584 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java index c4cae07e..85ce676a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java index 88e8f9b9..b96f1df2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java index 71bc0b98..1e506aa9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java index efe4049e..16818473 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index 3fa2ff03..81b74986 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java index 15f3534f..a0acd3f8 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java index 974566cf..5e535d85 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java index 444c725c..73153b60 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java index 75ce31e0..0ed277ba 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java index b466f08e..2e37fac2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java index 734f282b..82846d4c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java index edf0f3a6..339a4836 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java index 375ccde6..f748852c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java index 7057c357..04b23946 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java index c6f76920..3f9f13f2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java index d1fb88e1..5d31f30b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java index f6fcf19d..92af99c2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2022 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -109,4 +109,3 @@ public static ParserDescriptor worldParser() { } } - From 992476260f741619868a0e807af34b72cf972e73 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:05:42 -0700 Subject: [PATCH 53/72] Resolve non-javadoc style issues --- .../commandframework/sponge/CloudSpongeCommand.java | 3 ++- .../sponge/SpongeCommandManager.java | 4 ++-- .../sponge/SpongeRegistrationHandler.java | 2 +- .../sponge/parser/BlockInputParser.java | 4 ++-- .../sponge/parser/BlockPredicateParser.java | 3 ++- .../sponge/parser/ComponentParser.java | 4 ++-- .../sponge/parser/DataContainerParser.java | 12 ++++++++---- .../sponge/parser/GameProfileCollectionParser.java | 7 ++++--- .../sponge/parser/GameProfileParser.java | 4 ++-- .../sponge/parser/ItemStackPredicateParser.java | 7 ++++--- .../sponge/parser/MultipleEntitySelectorParser.java | 7 ++++--- .../sponge/parser/MultiplePlayerSelectorParser.java | 7 ++++--- .../sponge/parser/NamedTextColorParser.java | 4 ++-- .../sponge/parser/OperatorParser.java | 4 ++-- .../sponge/parser/ProtoItemStackParser.java | 7 ++++--- .../sponge/parser/RegistryEntryParser.java | 7 ++++--- .../sponge/parser/ResourceKeyParser.java | 4 ++-- .../sponge/parser/SingleEntitySelectorParser.java | 7 ++++--- .../sponge/parser/SinglePlayerSelectorParser.java | 7 ++++--- .../commandframework/sponge/parser/UserParser.java | 4 ++-- .../sponge/parser/Vector2dParser.java | 4 ++-- .../sponge/parser/Vector2iParser.java | 4 ++-- .../sponge/parser/Vector3dParser.java | 4 ++-- .../sponge/parser/Vector3iParser.java | 4 ++-- .../commandframework/sponge/parser/WorldParser.java | 4 ++-- 25 files changed, 71 insertions(+), 57 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index bbac0e99..28c6edc0 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -169,7 +169,8 @@ public Optional help(final @NonNull CommandCause cause) { @Override public Component usage(final CommandCause cause) { - return text(this.commandManager.commandSyntaxFormatter().apply(this.commandManager.senderMapper().map(cause), Collections.emptyList(), this.namedNode())); + return text(this.commandManager.commandSyntaxFormatter() + .apply(this.commandManager.senderMapper().map(cause), Collections.emptyList(), this.namedNode())); } private CommandNode namedNode() { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 9f67fa47..7b86d182 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -197,8 +197,8 @@ private void registerRegistryParsers() { @Override public boolean hasPermission( - @NonNull final C sender, - @NonNull final String permission + final @NonNull C sender, + final @NonNull String permission ) { if (permission.isEmpty()) { return true; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index a0bb8f05..e6117f44 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -75,7 +75,7 @@ void initialize(final @NonNull SpongeCommandManager commandManager) { } @Override - public boolean registerCommand(cloud.commandframework.@NonNull Command command) { + public boolean registerCommand(final cloud.commandframework.@NonNull Command command) { this.registeredCommands.add(command); return true; } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index cd21b9fc..fd293a02 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -77,8 +77,8 @@ public static ParserDescriptor blockInputParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index f8490e85..967ad017 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -51,7 +51,8 @@ * * @param sender type */ -public final class BlockPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { +public final class BlockPredicateParser implements ArgumentParser.FutureArgumentParser, + NodeSource, SuggestionProvider { public static ParserDescriptor blockPredicateParser() { return ParserDescriptor.of(new BlockPredicateParser<>(), BlockPredicate.class); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java index a7e023d4..44e3bc8b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java @@ -58,8 +58,8 @@ public static ParserDescriptor componentParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java index 34ad6d3c..645ecd9e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java @@ -47,7 +47,8 @@ * * @param sender type */ -public final class DataContainerParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { +public final class DataContainerParser implements ArgumentParser.FutureArgumentParser, + NodeSource, SuggestionProvider { public static ParserDescriptor dataContainerParser() { return ParserDescriptor.of(new DataContainerParser<>(), DataContainer.class); @@ -60,14 +61,17 @@ public static ParserDescriptor dataContainerParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + final @NonNull CommandContext context, + final @NonNull CommandInput input + ) { return this.mappedParser.suggestionProvider().suggestionsFuture(context, input); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java index 2e3c650c..7b830ca6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java @@ -58,7 +58,8 @@ * * @param sender type */ -public final class GameProfileCollectionParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class GameProfileCollectionParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor gameProfileCollectionParser() { return ParserDescriptor.of(new GameProfileCollectionParser<>(), GameProfileCollection.class); @@ -83,8 +84,8 @@ public static ParserDescriptor gameProfileCollecti @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java index e8e4c565..c25705c8 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java @@ -78,8 +78,8 @@ public static ParserDescriptor gameProfileParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index ddc5d584..8876640d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -51,7 +51,8 @@ * * @param sender type */ -public final class ItemStackPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { +public final class ItemStackPredicateParser implements ArgumentParser.FutureArgumentParser, + NodeSource, SuggestionProvider { public static ParserDescriptor itemStackPredicateParser() { return ParserDescriptor.of(new ItemStackPredicateParser<>(), ItemStackPredicate.class); @@ -74,8 +75,8 @@ public static ParserDescriptor itemStackPredicatePars @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java index 85ce676a..dc049c1b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java @@ -53,7 +53,8 @@ * * @param sender type */ -public final class MultipleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class MultipleEntitySelectorParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor multipleEntitySelectorParser() { return ParserDescriptor.of(new MultipleEntitySelectorParser<>(), MultipleEntitySelector.class); @@ -64,8 +65,8 @@ public static ParserDescriptor multipleEntitySele @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final CommandInput originalInput = inputQueue.copy(); return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java index b96f1df2..affb60f2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java @@ -54,7 +54,8 @@ * * @param sender type */ -public final class MultiplePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class MultiplePlayerSelectorParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor multiplePlayerSelectorParser() { return ParserDescriptor.of(new MultiplePlayerSelectorParser<>(), MultiplePlayerSelector.class); @@ -64,8 +65,8 @@ public static ParserDescriptor multiplePlayerSele @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final CommandInput originalInput = inputQueue.copy(); return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java index 1e506aa9..6efb2873 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java @@ -51,8 +51,8 @@ public static ParserDescriptor namedTextColorParser() { @Override public @NonNull ArgumentParseResult<@NonNull NamedTextColor> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final String input = inputQueue.readString().toLowerCase(Locale.ROOT); final NamedTextColor color = NamedTextColor.NAMES.value(input); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java index 16818473..6188b6c5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java @@ -68,8 +68,8 @@ public static ParserDescriptor operatorParser() { @Override public @NonNull ArgumentParseResult<@NonNull Operator> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final String input = inputQueue.readString(); final Optional operator = RegistryTypes.OPERATOR.get().stream() diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index 81b74986..d4562df3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -65,7 +65,8 @@ * * @param sender type */ -public final class ProtoItemStackParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class ProtoItemStackParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor protoItemStackParser() { return ParserDescriptor.of(new ProtoItemStackParser<>(), ProtoItemStack.class); @@ -77,8 +78,8 @@ public static ParserDescriptor protoItemStackParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java index a0acd3f8..c5557d33 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -58,7 +58,8 @@ * @param sender type * @param value type */ -public final class RegistryEntryParser implements NodeSource, ArgumentParser.FutureArgumentParser, BlockingSuggestionProvider.Strings { +public final class RegistryEntryParser implements NodeSource, + ArgumentParser.FutureArgumentParser, BlockingSuggestionProvider.Strings { // Start DefaultedRegistryType methods @@ -182,8 +183,8 @@ private Registry registry(final @NonNull CommandContext commandContext) { @SuppressWarnings("unchecked") @Override public @NonNull CompletableFuture<@NonNull ArgumentParseResult<@NonNull V>> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return ((ArgumentParser) RESOURCE_KEY_PARSER).parseFuture(commandContext, inputQueue).thenApply(keyResult -> { if (keyResult.failure().isPresent()) { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java index 5e535d85..d1824517 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java @@ -47,8 +47,8 @@ public static ParserDescriptor resourceKeyParser() { @Override public @NonNull ArgumentParseResult<@NonNull ResourceKey> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final String input = inputQueue.readString(); final ResourceKey key = ResourceKeyUtil.resourceKey(input); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java index 0ed277ba..21204db4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java @@ -50,7 +50,8 @@ * * @param sender type */ -public final class SingleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class SingleEntitySelectorParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor singleEntitySelectorParser() { return ParserDescriptor.of(new SingleEntitySelectorParser<>(), SingleEntitySelector.class); @@ -60,8 +61,8 @@ public static ParserDescriptor singleEntitySelector @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final CommandInput originalInput = inputQueue.copy(); return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java index 2e37fac2..057a70b7 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java @@ -51,7 +51,8 @@ * * @param sender type */ -public final class SinglePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { +public final class SinglePlayerSelectorParser implements NodeSource, + ArgumentParser.FutureArgumentParser, SuggestionProvider { public static ParserDescriptor singlePlayerSelectorParser() { return ParserDescriptor.of(new SinglePlayerSelectorParser<>(), SinglePlayerSelector.class); @@ -61,8 +62,8 @@ public static ParserDescriptor singlePlayerSelector @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final CommandInput originalInput = inputQueue.copy(); return this.nativeParser.parseFuture(commandContext, inputQueue).thenApply(result -> { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java index 82846d4c..98c30947 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java @@ -75,8 +75,8 @@ public static ParserDescriptor userParser() { @Override public @NonNull ArgumentParseResult<@NonNull UUID> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final CommandInput inputCopy = inputQueue.copy(); final String peek = inputQueue.readString(); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java index 339a4836..7e54ba8b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java @@ -83,8 +83,8 @@ public Vector2dParser(final boolean centerIntegers) { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java index f748852c..aacd6de4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java @@ -74,8 +74,8 @@ public static ParserDescriptor vector2iParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java index 04b23946..4b9a92df 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java @@ -83,8 +83,8 @@ public Vector3dParser(final boolean centerIntegers) { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java index 3f9f13f2..9ddf6a79 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java @@ -72,8 +72,8 @@ public static ParserDescriptor vector3iParser() { @Override public @NonNull CompletableFuture> parseFuture( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { return this.mappedParser.parseFuture(commandContext, inputQueue); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java index 92af99c2..5f0d331b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -75,8 +75,8 @@ public static ParserDescriptor worldParser() { @Override public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( - @NonNull final CommandContext<@NonNull C> commandContext, - @NonNull final CommandInput inputQueue + final @NonNull CommandContext<@NonNull C> commandContext, + final @NonNull CommandInput inputQueue ) { final String input = inputQueue.readString(); final ResourceKey key = ResourceKeyUtil.resourceKey(input); From 6884aa9ab0c78d6871ab2d143d234ac05b21694f Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:12:42 -0700 Subject: [PATCH 54/72] Javadoc fixes --- .../sponge/SpongeParserMapper.java | 4 ++-- .../sponge/parser/BlockInputParser.java | 8 ++++++- .../sponge/parser/BlockPredicateParser.java | 8 ++++++- .../sponge/parser/ComponentParser.java | 8 ++++++- .../sponge/parser/DataContainerParser.java | 8 ++++++- .../parser/GameProfileCollectionParser.java | 8 ++++++- .../sponge/parser/GameProfileParser.java | 8 ++++++- .../parser/ItemStackPredicateParser.java | 8 ++++++- .../parser/MultipleEntitySelectorParser.java | 8 ++++++- .../parser/MultiplePlayerSelectorParser.java | 8 ++++++- .../sponge/parser/NamedTextColorParser.java | 8 ++++++- .../sponge/parser/OperatorParser.java | 8 ++++++- .../sponge/parser/ProtoItemStackParser.java | 8 ++++++- .../sponge/parser/RegistryEntryParser.java | 22 +++++++++---------- .../sponge/parser/ResourceKeyParser.java | 8 ++++++- .../parser/SingleEntitySelectorParser.java | 8 ++++++- .../parser/SinglePlayerSelectorParser.java | 8 ++++++- .../sponge/parser/UserParser.java | 8 ++++++- .../sponge/parser/Vector2dParser.java | 15 ++++++++++++- .../sponge/parser/Vector2iParser.java | 8 ++++++- .../sponge/parser/Vector3dParser.java | 15 ++++++++++++- .../sponge/parser/Vector3iParser.java | 8 ++++++- .../sponge/parser/VectorParser.java | 2 +- .../sponge/parser/WorldParser.java | 8 ++++++- examples/example-sponge/build.gradle.kts | 2 +- 25 files changed, 176 insertions(+), 36 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index df3e13e4..5041226c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -53,7 +53,7 @@ * Class responsible for mapping Cloud {@link ArgumentParser ArgumentParsers} to Sponge * {@link CommandTreeNode.Argument CommandTreeNode.Arguments}. * - * @param sender type + * @param command sender type */ public final class SpongeParserMapper { @@ -257,7 +257,7 @@ public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { * Builder for mappings from Cloud {@link ArgumentParser ArgumentParsers} to Sponge * {@link CommandTreeNode.Argument CommandTreeNode.Arguments} * - * @param sender type + * @param command sender type * @param parser type */ public interface MappingBuilder> { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index fd293a02..1adf3c02 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -63,10 +63,16 @@ *
    • {@code andesite_stairs[waterlogged=true,facing=east]}
    • *
    * - * @param sender type + * @param command sender type */ public final class BlockInputParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link BlockInputParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor blockInputParser() { return ParserDescriptor.of(new BlockInputParser<>(), BlockInput.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index 967ad017..9b150177 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -49,11 +49,17 @@ /** * An argument for parsing {@link BlockPredicate BlockPredicates}. * - * @param sender type + * @param command sender type */ public final class BlockPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + /** + * Creates a new {@link BlockPredicateParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor blockPredicateParser() { return ParserDescriptor.of(new BlockPredicateParser<>(), BlockPredicate.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java index 44e3bc8b..1b678970 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java @@ -42,10 +42,16 @@ /** * An argument for parsing {@link Component Components} from json formatted text. * - * @param sender type + * @param command sender type */ public final class ComponentParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + /** + * Creates a new {@link ComponentParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor componentParser() { return ParserDescriptor.of(new ComponentParser<>(), Component.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java index 645ecd9e..65138a4f 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java @@ -45,11 +45,17 @@ * Argument for parsing {@link DataContainer DataContainers} from * SNBT strings. * - * @param sender type + * @param command sender type */ public final class DataContainerParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + /** + * Creates a new {@link DataContainerParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor dataContainerParser() { return ParserDescriptor.of(new DataContainerParser<>(), DataContainer.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java index 7b830ca6..32d4f3c5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java @@ -56,11 +56,17 @@ * Argument for parsing a {@link Collection} of {@link GameProfile GameProfiles} from a * {@link Selector}. A successfully parsed result will contain at least one element. * - * @param sender type + * @param command sender type */ public final class GameProfileCollectionParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link GameProfileCollectionParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor gameProfileCollectionParser() { return ParserDescriptor.of(new GameProfileCollectionParser<>(), GameProfileCollection.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java index c25705c8..c0773b16 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java @@ -49,10 +49,16 @@ /** * Argument for parsing a single {@link GameProfile} from a {@link Selector}. * - * @param sender type + * @param command sender type */ public final class GameProfileParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + /** + * Creates a new {@link GameProfileParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor gameProfileParser() { return ParserDescriptor.of(new GameProfileParser<>(), GameProfile.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index 8876640d..2ec11036 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -49,11 +49,17 @@ /** * An argument for parsing {@link ItemStackPredicate ItemStackPredicates}. * - * @param sender type + * @param command sender type */ public final class ItemStackPredicateParser implements ArgumentParser.FutureArgumentParser, NodeSource, SuggestionProvider { + /** + * Creates a new {@link ItemStackPredicateParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor itemStackPredicateParser() { return ParserDescriptor.of(new ItemStackPredicateParser<>(), ItemStackPredicate.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java index dc049c1b..c44a71e5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java @@ -51,11 +51,17 @@ /** * Argument for selecting one or more {@link Entity Entities} using a {@link Selector}. * - * @param sender type + * @param command sender type */ public final class MultipleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link MultipleEntitySelectorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor multipleEntitySelectorParser() { return ParserDescriptor.of(new MultipleEntitySelectorParser<>(), MultipleEntitySelector.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java index affb60f2..15f8c578 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java @@ -52,11 +52,17 @@ /** * Argument for selecting one or more {@link Player Players} using a {@link Selector}. * - * @param sender type + * @param command sender type */ public final class MultiplePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link MultiplePlayerSelectorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor multiplePlayerSelectorParser() { return ParserDescriptor.of(new MultiplePlayerSelectorParser<>(), MultiplePlayerSelector.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java index 6efb2873..6aea7215 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java @@ -41,10 +41,16 @@ /** * An argument for parsing {@link NamedTextColor NamedTextColors}. * - * @param sender type + * @param command sender type */ public final class NamedTextColorParser implements NodeSource, ArgumentParser, BlockingSuggestionProvider.Strings { + /** + * Creates a new {@link NamedTextColorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor namedTextColorParser() { return ParserDescriptor.of(new NamedTextColorParser<>(), NamedTextColor.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java index 6188b6c5..f6ca6caa 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java @@ -43,10 +43,16 @@ /** * An argument for parsing {@link Operator Operators}. * - * @param sender type + * @param command sender type */ public final class OperatorParser implements NodeSource, ArgumentParser, BlockingSuggestionProvider.Strings { + /** + * Creates a new {@link OperatorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor operatorParser() { return ParserDescriptor.of(new OperatorParser<>(), Operator.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index d4562df3..1a0570aa 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -63,11 +63,17 @@ *
  • {@code diamond_sword{Enchantments:[{id:sharpness,lvl:5}]}}
  • *
* - * @param sender type + * @param command sender type */ public final class ProtoItemStackParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link ProtoItemStackParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor protoItemStackParser() { return ParserDescriptor.of(new ProtoItemStackParser<>(), ProtoItemStack.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java index c5557d33..61b699ea 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -55,7 +55,7 @@ /** * An argument for retrieving values from any of Sponge's {@link Registry Registries}. * - * @param sender type + * @param command sender type * @param value type */ public final class RegistryEntryParser implements NodeSource, @@ -64,12 +64,12 @@ public final class RegistryEntryParser implements NodeSource, // Start DefaultedRegistryType methods /** - * Create a new required {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. + * Create a new {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. * + * @param command sender type + * @param value type * @param valueType value type * @param registryType registry type - * @param sender type - * @param value type * @return a new {@link RegistryEntryParser} */ public static @NonNull ParserDescriptor registryEntryParser( @@ -80,12 +80,12 @@ public final class RegistryEntryParser implements NodeSource, } /** - * Create a new required {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. + * Create a new {@link RegistryEntryParser} for a {@link DefaultedRegistryType}. * + * @param command sender type + * @param value type * @param valueType value type * @param registryType registry type - * @param sender type - * @param value type * @return a new {@link RegistryEntryParser} */ public static @NonNull ParserDescriptor registryEntryParser( @@ -100,13 +100,13 @@ public final class RegistryEntryParser implements NodeSource, // Start RegistryType methods /** - * Create a new required {@link RegistryEntryParser} for a {@link RegistryType} + * Create a new {@link RegistryEntryParser} for a {@link RegistryType} * using the specified {@link RegistryHolder} function. * *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, * it is suggested to instead use {@link #registryEntryParser(TypeToken, DefaultedRegistryType)}.

* - * @param sender type + * @param command sender type * @param value type * @param valueType value type * @param registryType registry type @@ -122,13 +122,13 @@ public final class RegistryEntryParser implements NodeSource, } /** - * Create a new required {@link RegistryEntryParser} for a {@link RegistryType} + * Create a new {@link RegistryEntryParser} for a {@link RegistryType} * using the specified {@link RegistryHolder} function. * *

For {@link RegistryType RegistryTypes} which are {@link DefaultedRegistryType DefaultedRegistryTypes}, * it is suggested to instead use {@link #registryEntryParser(TypeToken, DefaultedRegistryType)}.

* - * @param sender type + * @param command sender type * @param value type * @param valueType value type * @param registryType registry type diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java index d1824517..6fdabe2b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java @@ -37,10 +37,16 @@ /** * Argument for parsing {@link ResourceKey ResourceKeys}. * - * @param sender type + * @param command sender type */ public final class ResourceKeyParser implements NodeSource, ArgumentParser { + /** + * Creates a new {@link ResourceKeyParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor resourceKeyParser() { return ParserDescriptor.of(new ResourceKeyParser<>(), ResourceKey.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java index 21204db4..a1317cef 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java @@ -48,11 +48,17 @@ /** * Argument for selecting a single {@link Entity} using a {@link Selector}. * - * @param sender type + * @param command sender type */ public final class SingleEntitySelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link SingleEntitySelectorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor singleEntitySelectorParser() { return ParserDescriptor.of(new SingleEntitySelectorParser<>(), SingleEntitySelector.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java index 057a70b7..4c6c374a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java @@ -49,11 +49,17 @@ /** * Argument for selecting a single {@link Player} using a {@link Selector}. * - * @param sender type + * @param command sender type */ public final class SinglePlayerSelectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link SinglePlayerSelectorParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor singlePlayerSelectorParser() { return ParserDescriptor.of(new SinglePlayerSelectorParser<>(), SinglePlayerSelector.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java index 98c30947..e30fd408 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java @@ -62,10 +62,16 @@ * Argument for parsing {@link User} {@link UUID UUIDs} in the {@link UserManager} from * a {@link Selector}, last known username, or {@link UUID} string. * - * @param sender type + * @param command sender type */ public final class UserParser implements NodeSource, ArgumentParser, SuggestionProvider { + /** + * Creates a new {@link UserParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor userParser() { return ParserDescriptor.of(new UserParser<>(), UUID.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java index 7e54ba8b..5a970706 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java @@ -51,14 +51,27 @@ *
  • {@code ~1 ~-2}
  • * * - * @param sender type + * @param command sender type */ public final class Vector2dParser extends VectorParser { + /** + * Creates a new {@link Vector2dParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor vector2dParser() { return vector2dParser(false); } + /** + * Creates a new {@link Vector2dParser}. + * + * @param command sender type + * @param centerIntegers whether to center integers to x.5 + * @return new parser + */ public static ParserDescriptor vector2dParser(final boolean centerIntegers) { return ParserDescriptor.of(new Vector2dParser<>(centerIntegers), Vector2d.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java index aacd6de4..9840a949 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java @@ -55,10 +55,16 @@ *
  • {@code ^ ^}
  • * * - * @param sender type + * @param command sender type */ public final class Vector2iParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link Vector2iParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor vector2iParser() { return ParserDescriptor.of(new Vector2iParser<>(), Vector2i.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java index 4b9a92df..5a5deb57 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java @@ -52,14 +52,27 @@ *
  • {@code ^1 ^ ^-5}
  • * * - * @param sender type + * @param command sender type */ public final class Vector3dParser extends VectorParser { + /** + * Creates a new {@link Vector3dParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor vector3dParser() { return vector3dParser(false); } + /** + * Creates a new {@link Vector3dParser}. + * + * @param command sender type + * @param centerIntegers whether to center integers to x.5 + * @return new parser + */ public static ParserDescriptor vector3dParser(final boolean centerIntegers) { return ParserDescriptor.of(new Vector3dParser<>(centerIntegers), Vector3d.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java index 9ddf6a79..a470638d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java @@ -54,10 +54,16 @@ *
  • {@code ^1 ^ ^-5}
  • * * - * @param sender type + * @param command sender type */ public final class Vector3iParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { + /** + * Creates a new {@link Vector3iParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor vector3iParser() { return ParserDescriptor.of(new Vector3iParser<>(), Vector3i.class); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java index 5d31f30b..94e3cc30 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java @@ -32,7 +32,7 @@ * *

    Not for extension by API users.

    * - * @param sender type + * @param command sender type * @param vector type */ public abstract class VectorParser implements NodeSource, ArgumentParser.FutureArgumentParser, SuggestionProvider { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java index 5f0d331b..4eebe6ed 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -49,10 +49,16 @@ /** * Argument for retrieving {@link ServerWorld ServerWorlds} from the {@link WorldManager} by their {@link ResourceKey}. * - * @param sender type + * @param command sender type */ public final class WorldParser implements ArgumentParser, NodeSource, BlockingSuggestionProvider.Strings { + /** + * Creates a new {@link WorldParser}. + * + * @param command sender type + * @return new parser + */ public static ParserDescriptor worldParser() { return ParserDescriptor.of(new WorldParser<>(), ServerWorld.class); } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 75faa946..f5f2a0ec 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -2,7 +2,7 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders import org.spongepowered.plugin.metadata.model.PluginDependency plugins { - id("org.spongepowered.gradle.plugin") version "2.1.1" + id("org.spongepowered.gradle.plugin") version "2.2.0" alias(libs.plugins.shadow) } From 6d1f6aadd2b88fe7c15430ea803c8e761707bd98 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:41:29 -0700 Subject: [PATCH 55/72] Begin updating for 1.20.2+ --- cloud-sponge/build.gradle.kts | 8 +++++--- .../sponge/CloudSpongeCommand.java | 2 +- .../sponge/parser/BlockInputParser.java | 3 ++- .../sponge/parser/BlockPredicateParser.java | 3 ++- .../sponge/parser/ItemStackPredicateParser.java | 3 ++- .../sponge/parser/ProtoItemStackParser.java | 3 ++- .../sponge/parser/WorldParser.java | 12 ++++++------ examples/example-sponge/build.gradle.kts | 16 ++++++++++++++-- .../examples/sponge/CloudExamplePlugin.java | 7 ++++--- 9 files changed, 38 insertions(+), 19 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index c8387a31..d65944ff 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -5,14 +5,16 @@ plugins { id("org.spongepowered.gradle.vanilla") } +java.disableAutoTargetJvm() + dependencies { api(libs.cloud.core) implementation(project(":cloud-brigadier")) - compileOnly("org.spongepowered:spongeapi:8.1.0") - compileOnly("org.spongepowered:sponge:1.16.5-8.1.0-SNAPSHOT") + compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT") + compileOnly("org.spongepowered:sponge:1.20.2-11.0.0-SNAPSHOT") } minecraft { - version("1.16.5") + version("1.20.2") platform(MinecraftPlatform.JOINED) } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 28c6edc0..197aa03b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -183,7 +183,7 @@ public CommandTreeNode.Root commandTree() { final CommandNode cloud = this.namedNode(); - if (cloud.isLeaf() || cloud.command() != null) { + if (canExecute(cloud)) { root.executable(); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index 1adf3c02..4a4c5db5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -78,7 +78,8 @@ public static ParserDescriptor blockInputParser() { } private final ArgumentParser mappedParser = - new WrappedBrigadierParser(BlockStateArgument.block()) + // todo + new WrappedBrigadierParser(() -> BlockStateArgument.block()) .flatMapSuccess((ctx, blockInput) -> ArgumentParseResult.successFuture(new BlockInputImpl(blockInput))); @Override diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index 9b150177..f82a5eb8 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -66,7 +66,8 @@ public static ParserDescriptor blockPredicateParser() { private final ArgumentParser mappedParser = new WrappedBrigadierParser( - net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() + // todo + () -> net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() ).flatMapSuccess((ctx, result) -> { final CommandSourceStack commandSourceStack = (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index 2ec11036..6c253222 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -66,7 +66,8 @@ public static ParserDescriptor itemStackPredicatePars private final ArgumentParser mappedParser = new WrappedBrigadierParser( - ItemPredicateArgument.itemPredicate() + // TODO + () -> ItemPredicateArgument.itemPredicate() ).flatMapSuccess((ctx, result) -> { final CommandSourceStack commandSourceStack = (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index 1a0570aa..c059c57a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -79,7 +79,8 @@ public static ParserDescriptor protoItemStackParser() { } private final ArgumentParser mappedParser = - new WrappedBrigadierParser(ItemArgument.item()) + // todo + new WrappedBrigadierParser(() -> ItemArgument.item()) .flatMapSuccess((ctx, itemInput) -> ArgumentParseResult.successFuture(new ProtoItemStackImpl(itemInput))); @Override diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java index 4eebe6ed..906178f0 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -30,11 +30,13 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; +import com.google.common.base.Suppliers; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.commands.arguments.DimensionArgument; @@ -63,9 +65,7 @@ public static ParserDescriptor worldParser() { return ParserDescriptor.of(new WorldParser<>(), ServerWorld.class); } - private static final DynamicCommandExceptionType ERROR_INVALID_VALUE; - - static { + private static final Supplier ERROR_INVALID_VALUE = Suppliers.memoize(() -> { try { // ERROR_INVALID_VALUE (todo: use accessor) final Field errorInvalidValueField = Arrays.stream(DimensionArgument.class.getDeclaredFields()) @@ -73,11 +73,11 @@ public static ParserDescriptor worldParser() { .findFirst() .orElseThrow(IllegalStateException::new); errorInvalidValueField.setAccessible(true); - ERROR_INVALID_VALUE = (DynamicCommandExceptionType) errorInvalidValueField.get(null); + return (DynamicCommandExceptionType) errorInvalidValueField.get(null); } catch (final Exception ex) { throw new RuntimeException("Couldn't access ERROR_INVALID_VALUE command exception type.", ex); } - } + }); @Override public @NonNull ArgumentParseResult<@NonNull ServerWorld> parse( @@ -93,7 +93,7 @@ public static ParserDescriptor worldParser() { if (entry.isPresent()) { return ArgumentParseResult.success(entry.get()); } - return ArgumentParseResult.failure(ERROR_INVALID_VALUE.create(key)); + return ArgumentParseResult.failure(ERROR_INVALID_VALUE.get().create(key)); } @Override diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index f5f2a0ec..6d1ed4fe 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -3,9 +3,14 @@ import org.spongepowered.plugin.metadata.model.PluginDependency plugins { id("org.spongepowered.gradle.plugin") version "2.2.0" + id("conventions.base") alias(libs.plugins.shadow) } +indra { + javaVersions().target(17) +} + dependencies { implementation(project(":cloud-sponge")) implementation(project(":cloud-minecraft-extras")) @@ -13,7 +18,7 @@ dependencies { sponge { injectRepositories(false) - apiVersion("8.0.0") + apiVersion("11.0.0-SNAPSHOT") plugin("cloud-example-sponge") { loader { name(PluginLoaders.JAVA_PLAIN) @@ -38,6 +43,13 @@ tasks { configurations { spongeRuntime { - resolutionStrategy.cacheChangingModulesFor(1, "MINUTES") + resolutionStrategy { + cacheChangingModulesFor(1, "MINUTES") + eachDependency { + if (target.name == "spongevanilla") { + useVersion("1.20.+") + } + } + } } } diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index f8502c35..4469239f 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -40,12 +40,12 @@ import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.data.SinglePlayerSelector; import cloud.commandframework.types.tuples.Pair; -import com.google.common.collect.ImmutableList; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.TypeLiteral; import io.leangen.geantyref.TypeToken; +import java.util.List; import java.util.Optional; import java.util.function.Function; import net.kyori.adventure.text.Component; @@ -74,6 +74,7 @@ import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; import org.spongepowered.api.registry.RegistryHolder; import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.DefaultWorldKeys; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.schematic.PaletteTypes; @@ -200,7 +201,7 @@ private void registerCommands() { } final ItemStack modified = ItemStack.builder() .fromItemStack(result.polledItem().createStack()) - .add(Keys.APPLIED_ENCHANTMENTS, ImmutableList.of( + .add(Keys.APPLIED_ENCHANTMENTS, List.of( Enchantment.of( ctx.get("enchantment_type"), ctx.get("level") @@ -307,7 +308,7 @@ private void registerCommands() { final Function, RegistryHolder> holderFunction = ctx -> ctx.sender() .location() .map(Location::world) - .orElse(Sponge.server().worldManager().defaultWorld()); + .orElseGet(() -> Sponge.server().worldManager().world(DefaultWorldKeys.DEFAULT).orElseThrow()); this.commandManager.command(cloud.literal("test_biomes") .required("biome", registryEntryParser(Biome.class, RegistryTypes.BIOME, holderFunction)) .handler(ctx -> { From 44890161b9c9d6fad445d3ca1c43b85ba72484c5 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:49:24 -0700 Subject: [PATCH 56/72] Fix rebase typo --- settings.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 307ecf7e..3ac3a0d9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -52,5 +52,5 @@ include("cloud-fabric/common-repack") findProject(":cloud-fabric/common-repack")?.name = "cloud-minecraft-modded-common-fabric-repack" include("cloud-neoforge") include("cloud-sponge") -include("examples/cloud-sponge") -findProject(":examples/cloud-sponge")?.name = "cloud-sponge" +include("examples/example-sponge") +findProject(":examples/example-sponge")?.name = "example-sponge" From f591bce5abba7d7c452dd4d50f75a7e0a42a2269 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:56:17 -0700 Subject: [PATCH 57/72] Fix build --- cloud-sponge/build.gradle.kts | 2 +- examples/example-sponge/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index d65944ff..4d4b6072 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -9,7 +9,7 @@ java.disableAutoTargetJvm() dependencies { api(libs.cloud.core) - implementation(project(":cloud-brigadier")) + implementation(libs.cloud.brigadier) compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT") compileOnly("org.spongepowered:sponge:1.20.2-11.0.0-SNAPSHOT") } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 6d1ed4fe..069539ce 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -13,7 +13,7 @@ indra { dependencies { implementation(project(":cloud-sponge")) - implementation(project(":cloud-minecraft-extras")) + implementation(libs.cloud.minecraft.extras) } sponge { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0d9a86d0..c3bcaeba 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,8 @@ cloud-core = { module = "org.incendo:cloud-core", version.ref = "cloud" } cloud-brigadier = { module = "org.incendo:cloud-brigadier", version.ref = "cloudMinecraft" } cloud-minecraft-signed-arguments = { module = "org.incendo:cloud-minecraft-signed-arguments", version.ref = "cloudMinecraft" } adventureApi = { group = "net.kyori", name = "adventure-api", version = "4.15.0" } -adventureFabric = "net.kyori:adventure-platform-fabric:5.13.0" +adventureFabric = "net.kyori:adventure-platform-fabric:5.14.1" +cloud-minecraft-extras = { module = "org.incendo:cloud-minecraft-extras", version.ref = "cloudMinecraft" } immutables = { group = "org.immutables", name = "value", version.ref = "immutables" } immutablesAnnotate = { group = "org.immutables", name = "annotate", version.ref = "immutables" } @@ -45,6 +46,7 @@ neoForge = "net.neoforged:neoforge:20.6.121" cloud-buildLogic-spotless = { id = "org.incendo.cloud-build-logic.spotless", version.ref = "cloud-build-logic" } cloud-buildLogic-rootProject-publishing = { id = "org.incendo.cloud-build-logic.publishing.root-project", version.ref = "cloud-build-logic" } cloud-buildLogic-rootProject-spotless = { id = "org.incendo.cloud-build-logic.spotless.root-project", version.ref = "cloud-build-logic" } +shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } [bundles] immutables = ["immutables", "immutablesAnnotate"] From feebfee4a54c788b3b38d72d9a32342fa1509723 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:38:26 -0700 Subject: [PATCH 58/72] More updating for 1.20.2 --- cloud-sponge/build.gradle.kts | 3 +- .../sponge/SpongeRegistrationHandler.java | 81 ++++++++++++++++--- .../sponge/parser/BlockInputParser.java | 8 +- .../sponge/parser/BlockPredicateParser.java | 25 ++---- .../parser/ItemStackPredicateParser.java | 45 ++--------- .../sponge/parser/ProtoItemStackParser.java | 4 +- .../sponge/parser/RegistryEntryParser.java | 17 ++-- examples/example-sponge/build.gradle.kts | 4 - .../examples/sponge/CloudExamplePlugin.java | 2 +- 9 files changed, 100 insertions(+), 89 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index 4d4b6072..b092c6a8 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -5,11 +5,10 @@ plugins { id("org.spongepowered.gradle.vanilla") } -java.disableAutoTargetJvm() - dependencies { api(libs.cloud.core) implementation(libs.cloud.brigadier) + implementation(project(":cloud-minecraft-modded-common", configuration = "namedElements")) compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT") compileOnly("org.spongepowered:sponge:1.20.2-11.0.0-SNAPSHOT") } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index e6117f44..75fe15bd 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -24,17 +24,26 @@ package cloud.commandframework.sponge; import cloud.commandframework.CommandComponent; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.arguments.parser.EitherParser; +import cloud.commandframework.arguments.parser.MappedArgumentParser; +import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.internal.CommandNode; import cloud.commandframework.internal.CommandRegistrationHandler; +import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import io.leangen.geantyref.TypeToken; import java.util.HashSet; import java.util.Set; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.server.MinecraftServer; import org.checkerframework.checker.nullness.qual.NonNull; +import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; import org.spongepowered.api.event.EventListenerRegistration; import org.spongepowered.api.event.Order; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; +import org.spongepowered.api.event.lifecycle.StartedEngineEvent; import static java.util.Objects.requireNonNull; @@ -56,21 +65,53 @@ private void handleRegistrationEvent(final RegisterCommandEvent eve private void registerCommand(final RegisterCommandEvent event, final CommandComponent rootLiteral) { final String label = rootLiteral.name(); event.register( - this.commandManager.owningPluginContainer(), - new CloudSpongeCommand<>(label, this.commandManager), - label, - rootLiteral.alternativeAliases().toArray(new String[0]) + this.commandManager.owningPluginContainer(), + new CloudSpongeCommand<>(label, this.commandManager), + label, + rootLiteral.alternativeAliases().toArray(new String[0]) + ); + } + + private void startedEngine(final StartedEngineEvent serverStartedEngineEvent) { + final MinecraftServer engine = (MinecraftServer) serverStartedEngineEvent.engine(); + ContextualArgumentTypeProvider.withBuildContext( + this.commandManager, + CommandBuildContext.configurable(engine.registryAccess(), engine.getWorldData().enabledFeatures()), + true, + () -> { + for (final cloud.commandframework.Command registeredCommand : this.registeredCommands) { + for (final CommandComponent component : registeredCommand.components()) { + if (component.type() == CommandComponent.ComponentType.LITERAL + || component.type() == CommandComponent.ComponentType.FLAG) { + continue; + } + + for (final ArgumentParser parser : unwrap(component.parser())) { + if (parser instanceof WrappedBrigadierParser wrappedBrigadierParser) { + wrappedBrigadierParser.nativeArgumentType(); + } + } + } + } + } ); } void initialize(final @NonNull SpongeCommandManager commandManager) { this.commandManager = commandManager; Sponge.eventManager().registerListener( - EventListenerRegistration.builder(new TypeToken>() {}) - .plugin(this.commandManager.owningPluginContainer()) - .listener(this::handleRegistrationEvent) - .order(Order.DEFAULT) - .build() + EventListenerRegistration.builder(new TypeToken>() {}) + .plugin(this.commandManager.owningPluginContainer()) + .listener(this::handleRegistrationEvent) + .order(Order.DEFAULT) + .build() + ); + Sponge.eventManager().registerListener( + EventListenerRegistration.builder(new TypeToken>() {}) + .plugin(this.commandManager.owningPluginContainer()) + .listener(this::startedEngine) + .order(Order.DEFAULT) + .build() ); } @@ -79,4 +120,26 @@ public boolean registerCommand(final cloud.commandframework.@NonNull Command this.registeredCommands.add(command); return true; } + + private static Set> unwrap(final ArgumentParser parser) { + final HashSet> parsers = new HashSet<>(); + unwrap(parsers, parser); + return parsers; + } + + private static void unwrap( + final Set> parsers, + final ArgumentParser parser + ) { + if (parser instanceof MappedArgumentParser mapped) { + unwrap(parsers, mapped); + return; + } + if (parser instanceof EitherParser eitherParser) { + unwrap(parsers, eitherParser.primary().parser()); + unwrap(parsers, eitherParser.fallback().parser()); + return; + } + parsers.add(parser); + } } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index 4a4c5db5..b436b4a3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -31,6 +31,7 @@ import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.context.CommandInput; +import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.BlockInput; import java.lang.reflect.Field; @@ -78,9 +79,10 @@ public static ParserDescriptor blockInputParser() { } private final ArgumentParser mappedParser = - // todo - new WrappedBrigadierParser(() -> BlockStateArgument.block()) - .flatMapSuccess((ctx, blockInput) -> ArgumentParseResult.successFuture(new BlockInputImpl(blockInput))); + new WrappedBrigadierParser( + new ContextualArgumentTypeProvider<>(BlockStateArgument::block) + ).flatMapSuccess((ctx, blockInput) -> + ArgumentParseResult.successFuture(new BlockInputImpl(blockInput))); @Override public @NonNull CompletableFuture> parseFuture( diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index f82a5eb8..e1062ebc 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -31,13 +31,11 @@ import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.context.CommandInput; +import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.BlockPredicate; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; -import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.pattern.BlockInWorld; import org.checkerframework.checker.nullness.qual.NonNull; @@ -66,19 +64,8 @@ public static ParserDescriptor blockPredicateParser() { private final ArgumentParser mappedParser = new WrappedBrigadierParser( - // todo - () -> net.minecraft.commands.arguments.blocks.BlockPredicateArgument.blockPredicate() - ).flatMapSuccess((ctx, result) -> { - final CommandSourceStack commandSourceStack = - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); - try { - return ArgumentParseResult.successFuture( - new BlockPredicateImpl(result.create(commandSourceStack.getLevel().getTagManager())) - ); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failureFuture(ex); - } - }); + new ContextualArgumentTypeProvider<>(net.minecraft.commands.arguments.blocks.BlockPredicateArgument::blockPredicate) + ).flatMapSuccess((ctx, result) -> ArgumentParseResult.successFuture(new BlockPredicateImpl(result))); @Override public @NonNull CompletableFuture<@NonNull ArgumentParseResult> parseFuture( @@ -101,11 +88,9 @@ public static ParserDescriptor blockPredicateParser() { return CommandTreeNodeTypes.BLOCK_PREDICATE.get().createNode(); } - private static final class BlockPredicateImpl implements BlockPredicate { + private record BlockPredicateImpl(Predicate predicate) implements BlockPredicate { - private final Predicate predicate; - - BlockPredicateImpl(final @NonNull Predicate predicate) { + private BlockPredicateImpl(final @NonNull Predicate predicate) { this.predicate = predicate; } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index 6c253222..eefaabf9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -31,15 +31,11 @@ import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.context.CommandInput; +import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.ItemStackPredicate; -import com.mojang.brigadier.context.StringRange; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import java.util.Collections; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; -import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.item.ItemPredicateArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; @@ -66,19 +62,8 @@ public static ParserDescriptor itemStackPredicatePars private final ArgumentParser mappedParser = new WrappedBrigadierParser( - // TODO - () -> ItemPredicateArgument.itemPredicate() - ).flatMapSuccess((ctx, result) -> { - final CommandSourceStack commandSourceStack = - (CommandSourceStack) ctx.get(SpongeCommandContextKeys.COMMAND_CAUSE); - try { - final com.mojang.brigadier.context.CommandContext dummyContext = - createDummyContext(ctx, commandSourceStack); - return ArgumentParseResult.successFuture(new ItemStackPredicateImpl(result.create(dummyContext))); - } catch (final CommandSyntaxException ex) { - return ArgumentParseResult.failureFuture(ex); - } - }); + new ContextualArgumentTypeProvider<>(ItemPredicateArgument::itemPredicate) + ).flatMapSuccess((ctx, result) -> ArgumentParseResult.successFuture(new ItemStackPredicateImpl(result))); @Override public @NonNull CompletableFuture> parseFuture( @@ -101,11 +86,9 @@ public static ParserDescriptor itemStackPredicatePars return CommandTreeNodeTypes.ITEM_PREDICATE.get().createNode(); } - private static final class ItemStackPredicateImpl implements ItemStackPredicate { + private record ItemStackPredicateImpl(Predicate predicate) implements ItemStackPredicate { - private final Predicate predicate; - - ItemStackPredicateImpl(final @NonNull Predicate predicate) { + private ItemStackPredicateImpl(final @NonNull Predicate predicate) { this.predicate = predicate; } @@ -117,22 +100,4 @@ public boolean test(final @NonNull ItemStack itemStack) { } - private static com.mojang.brigadier.context.@NonNull CommandContext createDummyContext( - final @NonNull CommandContext ctx, - final @NonNull CommandSourceStack commandSourceStack - ) { - return new com.mojang.brigadier.context.CommandContext<>( - commandSourceStack, - ctx.rawInput().input(), - Collections.emptyMap(), - null, - null, - Collections.emptyList(), - StringRange.at(0), - null, - null, - false - ); - } - } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index c059c57a..c71d4491 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -31,6 +31,7 @@ import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.context.CommandInput; +import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; @@ -79,8 +80,7 @@ public static ParserDescriptor protoItemStackParser() { } private final ArgumentParser mappedParser = - // todo - new WrappedBrigadierParser(() -> ItemArgument.item()) + new WrappedBrigadierParser(new ContextualArgumentTypeProvider<>(ItemArgument::item)) .flatMapSuccess((ctx, itemInput) -> ArgumentParseResult.successFuture(new ProtoItemStackImpl(itemInput))); @Override diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java index 61b699ea..f5b69a76 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -216,16 +216,17 @@ private Registry registry(final @NonNull CommandContext commandContext) { if (this.registryType.equals(RegistryTypes.SOUND_TYPE)) { return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() .completions(CommandCompletionProviders.AVAILABLE_SOUNDS); - } else if (this.registryType.equals(RegistryTypes.BIOME)) { - return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() - .completions(CommandCompletionProviders.AVAILABLE_BIOMES); + //} else if (this.registryType.equals(RegistryTypes.BIOME)) { + // return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() + // .completions(CommandCompletionProviders.AVAILABLE_BIOMES); } else if (this.registryType.equals(RegistryTypes.ENTITY_TYPE)) { - return CommandTreeNodeTypes.ENTITY_SUMMON.get().createNode() + // return CommandTreeNodeTypes.ENTITY_SUMMON.get().createNode() + return CommandTreeNodeTypes.RESOURCE_LOCATION.get().createNode() .completions(CommandCompletionProviders.SUMMONABLE_ENTITIES); - } else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { - return CommandTreeNodeTypes.ITEM_ENCHANTMENT.get().createNode(); - } else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { - return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); + //} else if (this.registryType.equals(RegistryTypes.ENCHANTMENT_TYPE)) { + // return CommandTreeNodeTypes.ITEM_ENCHANTMENT.get().createNode(); + //} else if (this.registryType.equals(RegistryTypes.POTION_EFFECT_TYPE)) { + // return CommandTreeNodeTypes.MOB_EFFECT.get().createNode(); } else if (this.registryType.equals(RegistryTypes.WORLD_TYPE)) { return CommandTreeNodeTypes.DIMENSION.get().createNode() .customCompletions(); // Sponge adds custom types (?) diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 069539ce..409e6a0d 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -7,10 +7,6 @@ plugins { alias(libs.plugins.shadow) } -indra { - javaVersions().target(17) -} - dependencies { implementation(project(":cloud-sponge")) implementation(libs.cloud.minecraft.extras) diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index 4469239f..a81e2e6a 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -1,7 +1,7 @@ // // MIT License // -// Copyright (c) 2021 Alexander Söderberg & Contributors +// Copyright (c) 2024 Incendo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From c34e2f377d959a82004fa27092741bdcc4889c9e Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:40:45 -0700 Subject: [PATCH 59/72] Add missing check for aggregate arguments --- .../commandframework/sponge/SpongeRegistrationHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 75fe15bd..a345f07e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -24,6 +24,7 @@ package cloud.commandframework.sponge; import cloud.commandframework.CommandComponent; +import cloud.commandframework.arguments.aggregate.AggregateCommandParser; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.arguments.parser.EitherParser; import cloud.commandframework.arguments.parser.MappedArgumentParser; @@ -140,6 +141,12 @@ private static void unwrap( unwrap(parsers, eitherParser.fallback().parser()); return; } + if (parser instanceof AggregateCommandParser aggregateParser) { + for (final CommandComponent component : aggregateParser.components()) { + unwrap(parsers, component.parser()); + } + return; + } parsers.add(parser); } } From 2b969c0f5e8618c734993b4d57db53c8a9b52782 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:04:07 -0700 Subject: [PATCH 60/72] Clean up & tooltip suggestion support --- .../sponge/CloudSpongeCommand.java | 77 ++----------- .../sponge/SpongeCommandManager.java | 11 +- .../SpongeDefaultExceptionHandlers.java | 101 ++++++++++++++++++ .../sponge/SpongeParserMapper.java | 18 ++-- .../sponge/suggestion/SpongeSuggestion.java | 98 +++++++++++++++++ .../suggestion/SpongeSuggestionImpl.java | 32 ++++++ .../sponge/suggestion/package-info.java | 4 + .../examples/sponge/CloudExamplePlugin.java | 5 +- 8 files changed, 259 insertions(+), 87 deletions(-) create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java create mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 197aa03b..c7e443bf 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -26,12 +26,6 @@ import cloud.commandframework.CommandComponent; import cloud.commandframework.arguments.LiteralParser; import cloud.commandframework.arguments.compound.CompoundParser; -import cloud.commandframework.exceptions.ArgumentParseException; -import cloud.commandframework.exceptions.CommandExecutionException; -import cloud.commandframework.exceptions.InvalidCommandSenderException; -import cloud.commandframework.exceptions.InvalidSyntaxException; -import cloud.commandframework.exceptions.NoPermissionException; -import cloud.commandframework.exceptions.NoSuchCommandException; import cloud.commandframework.internal.CommandNode; import cloud.commandframework.permission.Permission; import cloud.commandframework.types.tuples.Pair; @@ -41,9 +35,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; -import net.kyori.adventure.util.ComponentMessageThrowable; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.Command; import org.spongepowered.api.command.CommandCause; @@ -53,19 +45,9 @@ import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import static net.kyori.adventure.text.Component.text; -import static net.kyori.adventure.text.format.NamedTextColor.GRAY; -import static net.kyori.adventure.text.format.NamedTextColor.RED; final class CloudSpongeCommand implements Command.Raw { - private static final Component NULL = text("null"); - private static final Component MESSAGE_INTERNAL_ERROR = - text("An internal error occurred while attempting to perform this command.", RED); - private static final Component MESSAGE_NO_PERMS = - text("I'm sorry, but you do not have permission to perform this command. " - + "Please contact the server administrators if you believe that this is in error.", RED); - private static final Component MESSAGE_UNKNOWN_COMMAND = text("Unknown command. Type \"/help\" for help."); - private final SpongeCommandManager commandManager; private final String label; @@ -85,63 +67,18 @@ public CommandResult process(final @NonNull CommandCause cause, final ArgumentRe return CommandResult.success(); } - // todo - public static void registerExceptionHandlers(final SpongeCommandManager mgr) { - mgr.exceptionController().registerHandler(InvalidSyntaxException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(text().append( - text("Invalid Command Syntax. Correct command syntax is: ", RED), - text("/" + ctx.exception().correctSyntax(), GRAY) - ).build()); - }); - mgr.exceptionController().registerHandler(InvalidCommandSenderException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(text(ctx.exception().getMessage(), RED)); - }); - mgr.exceptionController().registerHandler(NoPermissionException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(MESSAGE_NO_PERMS); - }); - mgr.exceptionController().registerHandler(NoSuchCommandException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(MESSAGE_UNKNOWN_COMMAND); - }); - mgr.exceptionController().registerHandler(ArgumentParseException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(text().append( - text("Invalid Command Argument: ", RED), - getMessage(ctx.exception().getCause()).colorIfAbsent(GRAY) - ).build()); - }); - mgr.exceptionController().registerHandler(CommandExecutionException.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(MESSAGE_INTERNAL_ERROR); - mgr.owningPluginContainer().logger() - .error("Exception executing command handler", ctx.exception().getCause()); - }); - mgr.exceptionController().registerHandler(Throwable.class, ctx -> { - final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); - audience.sendMessage(MESSAGE_INTERNAL_ERROR); - mgr.owningPluginContainer().logger() - .error("An unhandled exception was thrown during command execution", ctx.exception()); - }); - } - - private static Component getMessage(final Throwable throwable) { - final Component msg = ComponentMessageThrowable.getOrConvertMessage(throwable); - return msg == null ? NULL : msg; - } - @Override public List complete( final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments ) { - return this.commandManager.suggestionFactory().suggestImmediately( - this.commandManager.senderMapper().map(cause), - this.formatCommandForSuggestions(arguments.input()) - // todo - ).list().stream().map(s -> CommandCompletion.of(s.suggestion())).collect(Collectors.toList()); + return this.commandManager.suggestionFactory() + .suggestImmediately(this.commandManager.senderMapper().map(cause), + this.formatCommandForSuggestions(arguments.input())) + .list() + .stream() + .map(s -> CommandCompletion.of(s.suggestion(), s.tooltip())) + .collect(Collectors.toList()); } @Override diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 7b86d182..709e641c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -27,6 +27,7 @@ import cloud.commandframework.SenderMapper; import cloud.commandframework.SenderMapperHolder; import cloud.commandframework.arguments.parser.ParserParameters; +import cloud.commandframework.arguments.suggestion.SuggestionFactory; import cloud.commandframework.execution.ExecutionCoordinator; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; @@ -34,6 +35,7 @@ import cloud.commandframework.sponge.parser.RegistryEntryParser; import cloud.commandframework.sponge.parser.Vector2dParser; import cloud.commandframework.sponge.parser.Vector3dParser; +import cloud.commandframework.sponge.suggestion.SpongeSuggestion; import cloud.commandframework.state.RegistrationState; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; @@ -91,6 +93,7 @@ public final class SpongeCommandManager extends CommandManager implements private final PluginContainer pluginContainer; private final SenderMapper senderMapper; private final SpongeParserMapper parserMapper; + private final SuggestionFactory suggestionFactory; /** * Create a new command manager instance @@ -115,8 +118,14 @@ public SpongeCommandManager( this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); this.captionRegistry(new SpongeCaptionRegistry<>()); + this.suggestionFactory = super.suggestionFactory().mapped(SpongeSuggestion::spongeSuggestion); - CloudSpongeCommand.registerExceptionHandlers(this); + SpongeDefaultExceptionHandlers.register(this); + } + + @Override + public @NonNull SuggestionFactory suggestionFactory() { + return this.suggestionFactory; } private void checkLateCreation() { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java new file mode 100644 index 00000000..597faffb --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java @@ -0,0 +1,101 @@ +// +// MIT License +// +// Copyright (c) 2024 Incendo +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge; + +import cloud.commandframework.exceptions.ArgumentParseException; +import cloud.commandframework.exceptions.CommandExecutionException; +import cloud.commandframework.exceptions.InvalidCommandSenderException; +import cloud.commandframework.exceptions.InvalidSyntaxException; +import cloud.commandframework.exceptions.NoPermissionException; +import cloud.commandframework.exceptions.NoSuchCommandException; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.util.ComponentMessageThrowable; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.DefaultQualifier; + +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; +import static net.kyori.adventure.text.format.NamedTextColor.RED; + +@DefaultQualifier(NonNull.class) +final class SpongeDefaultExceptionHandlers { + private static final Component NULL = text("null"); + private static final Component MESSAGE_INTERNAL_ERROR = + text("An internal error occurred while attempting to perform this command.", RED); + private static final Component MESSAGE_NO_PERMS = + text("I'm sorry, but you do not have permission to perform this command. " + + "Please contact the server administrators if you believe that this is in error.", RED); + private static final Component MESSAGE_UNKNOWN_COMMAND = text("Unknown command. Type \"/help\" for help."); + + private SpongeDefaultExceptionHandlers() { + } + + static void register(final SpongeCommandManager mgr) { + mgr.exceptionController().registerHandler(InvalidSyntaxException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text().append( + text("Invalid Command Syntax. Correct command syntax is: ", RED), + text("/" + ctx.exception().correctSyntax(), GRAY) + ).build()); + }); + mgr.exceptionController().registerHandler(InvalidCommandSenderException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text(ctx.exception().getMessage(), RED)); + }); + mgr.exceptionController().registerHandler(NoPermissionException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_NO_PERMS); + }); + mgr.exceptionController().registerHandler(NoSuchCommandException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_UNKNOWN_COMMAND); + }); + mgr.exceptionController().registerHandler(ArgumentParseException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(text().append( + text("Invalid Command Argument: ", RED), + getMessage(ctx.exception().getCause()).colorIfAbsent(GRAY) + ).build()); + }); + mgr.exceptionController().registerHandler(CommandExecutionException.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + mgr.owningPluginContainer().logger() + .error("Exception executing command handler", ctx.exception().getCause()); + }); + mgr.exceptionController().registerHandler(Throwable.class, ctx -> { + final Audience audience = ctx.context().get(SpongeCommandContextKeys.COMMAND_CAUSE).audience(); + audience.sendMessage(MESSAGE_INTERNAL_ERROR); + mgr.owningPluginContainer().logger() + .error("An unhandled exception was thrown during command execution", ctx.exception()); + }); + } + + private static Component getMessage(final Throwable throwable) { + final @Nullable Component msg = ComponentMessageThrowable.getOrConvertMessage(throwable); + return msg == null ? NULL : msg; + } +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index 5041226c..df9bf97d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -239,18 +239,12 @@ public > void cloudSuggestions( * @param cloudNumberSuggestions whether to use Cloud number suggestions */ public void cloudNumberSuggestions(final boolean cloudNumberSuggestions) { - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); - this.cloudSuggestions(new TypeToken>() { - }, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); + this.cloudSuggestions(new TypeToken>() {}, cloudNumberSuggestions); } /** diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java new file mode 100644 index 00000000..a7bf6982 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java @@ -0,0 +1,98 @@ +// +// MIT License +// +// Copyright (c) 2024 Incendo +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.suggestion; + +import cloud.commandframework.arguments.suggestion.Suggestion; +import cloud.commandframework.brigadier.suggestion.TooltipSuggestion; +import java.util.Optional; +import net.kyori.adventure.text.Component; +import net.minecraft.network.chat.ComponentUtils; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.common.adventure.SpongeAdventure; + +/** + * {@link Suggestion} that has an optional {@link net.kyori.adventure.text.Component} tooltip. + */ +public interface SpongeSuggestion extends Suggestion { + + /** + * Returns a new {@link SpongeSuggestion} with the given {@code suggestion} and {@code tooltip}. + * + * @param suggestion the suggestion + * @param tooltip the optional tooltip that is displayed when hovering over the suggestion + * @return the suggestion instance + */ + static @NonNull SpongeSuggestion suggestion( + final @NonNull String suggestion, + final @Nullable Component tooltip + ) { + return new SpongeSuggestionImpl(suggestion, tooltip); + } + + /** + * Returns a new {@link SpongeSuggestion} that uses the given {@code suggestion} and has a {@code null} tooltip. + * + * @param suggestion the suggestion + * @return the suggestion instance + */ + static @NonNull SpongeSuggestion spongeSuggestion( + final @NonNull Suggestion suggestion + ) { + if (suggestion instanceof SpongeSuggestion) { + return (SpongeSuggestion) suggestion; + } + if (suggestion instanceof TooltipSuggestion tooltipSuggestion) { + final @Nullable Component tooltip = Optional.ofNullable(tooltipSuggestion.tooltip()) + .map(ComponentUtils::fromMessage) + .map(SpongeAdventure::asAdventure) + .orElse(null); + return suggestion(tooltipSuggestion.suggestion(), tooltip); + } + return suggestion(suggestion.suggestion(), null /* tooltip */); + } + + /** + * Returns the tooltip. + * + * @return the tooltip, or {@code null} + */ + @Nullable Component tooltip(); + + @Override + default @NonNull SpongeSuggestion withSuggestion(@NonNull String string) { + return suggestion(string, this.tooltip()); + } + + /** + * Returns a copy of this suggestion instance using the given {@code tooltip} + * + * @param tooltip the new tooltip + * @return the new suggestion + */ + default @NonNull SpongeSuggestion withTooltip(@NonNull Component tooltip) { + return suggestion(this.suggestion(), tooltip); + } + +} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java new file mode 100644 index 00000000..a4b18be8 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java @@ -0,0 +1,32 @@ +// +// MIT License +// +// Copyright (c) 2024 Incendo +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.sponge.suggestion; + +import net.kyori.adventure.text.Component; + +record SpongeSuggestionImpl( + String suggestion, + Component tooltip + +) implements SpongeSuggestion {} diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java new file mode 100644 index 00000000..0891f3c2 --- /dev/null +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java @@ -0,0 +1,4 @@ +/** + * Sponge suggestion related classes. + */ +package cloud.commandframework.sponge.suggestion; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index a81e2e6a..c00afc4e 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -138,10 +138,7 @@ public CloudExamplePlugin(final @NonNull Injector injector) { ); // Get command manager instance - this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral>() {})); - - // Use Cloud's enhanced number suggestions - this.commandManager.parserMapper().cloudNumberSuggestions(true); + this.commandManager = childInjector.getInstance(Key.get(new TypeLiteral<>() {})); // Register minecraft-extras exception handlers MinecraftExceptionHandler.create(CommandCause::audience) From ec874bad484095f87a2f66e6098bd7646641b7c8 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:59:44 -0700 Subject: [PATCH 61/72] Update for cloud changes --- cloud-sponge/build.gradle.kts | 1 + .../commandframework/sponge/SpongeRegistrationHandler.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index b092c6a8..ec92a4d7 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -2,6 +2,7 @@ import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform plugins { id("conventions.base") + id("conventions.publishing") id("org.spongepowered.gradle.vanilla") } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index a345f07e..7669e743 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -24,7 +24,7 @@ package cloud.commandframework.sponge; import cloud.commandframework.CommandComponent; -import cloud.commandframework.arguments.aggregate.AggregateCommandParser; +import cloud.commandframework.arguments.aggregate.AggregateParser; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.arguments.parser.EitherParser; import cloud.commandframework.arguments.parser.MappedArgumentParser; @@ -141,7 +141,7 @@ private static void unwrap( unwrap(parsers, eitherParser.fallback().parser()); return; } - if (parser instanceof AggregateCommandParser aggregateParser) { + if (parser instanceof AggregateParser aggregateParser) { for (final CommandComponent component : aggregateParser.components()) { unwrap(parsers, component.parser()); } From dd3ad448b6ee44bd23564baf7d340ee1ceb0e639 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:03:47 -0700 Subject: [PATCH 62/72] Handle all aggregates not just compound --- .../commandframework/sponge/CloudSpongeCommand.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index c7e443bf..145af35a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -25,7 +25,7 @@ import cloud.commandframework.CommandComponent; import cloud.commandframework.arguments.LiteralParser; -import cloud.commandframework.arguments.compound.CompoundParser; +import cloud.commandframework.arguments.aggregate.AggregateParser; import cloud.commandframework.internal.CommandNode; import cloud.commandframework.permission.Permission; import cloud.commandframework.types.tuples.Pair; @@ -136,9 +136,8 @@ private void addChildren(final CommandTreeNode node, final CommandNode clo final CommandTreeNode.Argument> treeNode; if (value.parser() instanceof LiteralParser) { treeNode = (CommandTreeNode.Argument>) CommandTreeNode.literal(); - } else if (value.parser() instanceof CompoundParser) { - final CompoundParser compound = (CompoundParser) value.parser(); - this.handleCompoundArgument(node, child, compound); + } else if (value.parser() instanceof AggregateParser aggregate) { + this.handleAggregate(node, child, aggregate); continue; } else { treeNode = this.commandManager.parserMapper().mapComponent(value); @@ -152,10 +151,10 @@ private void addChildren(final CommandTreeNode node, final CommandNode clo } } - private void handleCompoundArgument( + private void handleAggregate( final CommandTreeNode node, final CommandNode child, - final CompoundParser compound + final AggregateParser compound ) { final CommandTreeNode.Argument> treeNode; final ArrayDeque>>> nodes = new ArrayDeque<>(); From 17302b615d57fe2b84710b68d3aee6d299232114 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:46:07 -0700 Subject: [PATCH 63/72] Update for caption changes --- .../sponge/SpongeCommandManager.java | 2 +- ...ava => SpongeDefaultCaptionsProvider.java} | 48 ++++++++++--------- .../sponge/SpongeParserMapper.java | 18 ++----- 3 files changed, 30 insertions(+), 38 deletions(-) rename cloud-sponge/src/main/java/cloud/commandframework/sponge/{SpongeCaptionRegistry.java => SpongeDefaultCaptionsProvider.java} (65%) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 709e641c..27568949 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -117,7 +117,7 @@ public SpongeCommandManager( this.parserMapper = new SpongeParserMapper<>(); this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this)); this.registerParsers(); - this.captionRegistry(new SpongeCaptionRegistry<>()); + this.captionRegistry().registerProvider(new SpongeDefaultCaptionsProvider<>()); this.suggestionFactory = super.suggestionFactory().mapped(SpongeSuggestion::spongeSuggestion); SpongeDefaultExceptionHandlers.register(this); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java similarity index 65% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java rename to cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java index 55c179c9..d0cb3a83 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionRegistry.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java @@ -24,14 +24,15 @@ package cloud.commandframework.sponge; import cloud.commandframework.captions.CaptionProvider; -import cloud.commandframework.captions.StandardCaptionRegistry; +import cloud.commandframework.captions.DelegatingCaptionProvider; +import org.checkerframework.checker.nullness.qual.NonNull; /** - * Caption registry that uses bi-functions to produce messages. + * Provides the default captions for messages in cloud-sponge. * * @param command sender type */ -public class SpongeCaptionRegistry extends StandardCaptionRegistry { +public final class SpongeDefaultCaptionsProvider extends DelegatingCaptionProvider { /** * Default caption for {@link SpongeCaptionKeys#ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY} @@ -63,26 +64,27 @@ public class SpongeCaptionRegistry extends StandardCaptionRegistry { public static final String ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED = "The provided selector matched multiple game profiles, but only one is allowed."; - protected SpongeCaptionRegistry() { - super(); + private static final CaptionProvider PROVIDER = CaptionProvider.constantProvider() + .putCaption( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, + ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY) + .putCaption( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME, + ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME) + .putCaption( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID, + ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID) + .putCaption( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT, + ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT) + .putCaption( + SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED, + ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED) + .build(); - this.registerProvider(CaptionProvider.constantProvider() - .putCaptions( - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY, - ARGUMENT_PARSE_FAILURE_REGISTRY_ENTRY_UNKNOWN_ENTRY) - .putCaptions( - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME, - ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_NAME) - .putCaptions( - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID, - ARGUMENT_PARSE_FAILURE_USER_CANNOT_FIND_USER_WITH_UUID) - .putCaptions( - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT, - ARGUMENT_PARSE_FAILURE_USER_INVALID_INPUT) - .putCaptions( - SpongeCaptionKeys.ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED, - ARGUMENT_PARSE_FAILURE_GAME_PROFILE_TOO_MANY_SELECTED) - .build()); + @SuppressWarnings("unchecked") + @Override + public @NonNull CaptionProvider delegate() { + return (CaptionProvider) PROVIDER; } - } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index df9bf97d..acf7a03f 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -301,19 +301,9 @@ private static final class MappingBuilderImpl> } - private static final class Mapping> { - - private final Function>> mapper; - private final boolean cloudSuggestions; - - private Mapping( - final Function>> mapper, - final boolean cloudSuggestions - ) { - this.mapper = mapper; - this.cloudSuggestions = cloudSuggestions; - } - - } + private record Mapping>( + Function>> mapper, + boolean cloudSuggestions + ) {} } From be90dc3a092592498b2575f74b4db786015df5aa Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 24 Jan 2024 19:03:50 -0700 Subject: [PATCH 64/72] Update --- .../sponge/CloudInjectionModule.java | 4 +-- .../sponge/CloudSpongeCommand.java | 12 ++++---- .../commandframework/sponge/NodeSource.java | 3 +- .../sponge/SpongeCaptionKeys.java | 2 +- .../sponge/SpongeCommandContextKeys.java | 6 ++-- .../sponge/SpongeCommandManager.java | 20 ++++++------- .../sponge/SpongeCommandPreprocessor.java | 8 ++--- .../sponge/SpongeDefaultCaptionsProvider.java | 4 +-- .../SpongeDefaultExceptionHandlers.java | 12 ++++---- .../sponge/SpongeParserMapper.java | 30 +++++++++---------- .../sponge/SpongeParserParameters.java | 2 +- .../sponge/SpongeRegistrationHandler.java | 24 +++++++-------- .../sponge/parser/BlockInputParser.java | 18 +++++------ .../sponge/parser/BlockPredicateParser.java | 21 ++++++------- .../sponge/parser/ComponentParser.java | 16 +++++----- .../sponge/parser/DataContainerParser.java | 16 +++++----- .../parser/GameProfileCollectionParser.java | 16 +++++----- .../sponge/parser/GameProfileParser.java | 18 +++++------ .../parser/ItemStackPredicateParser.java | 18 +++++------ .../parser/MultipleEntitySelectorParser.java | 16 +++++----- .../parser/MultiplePlayerSelectorParser.java | 16 +++++----- .../sponge/parser/NamedTextColorParser.java | 12 ++++---- .../sponge/parser/OperatorParser.java | 12 ++++---- .../sponge/parser/ProtoItemStackParser.java | 18 +++++------ .../sponge/parser/RegistryEntryParser.java | 16 +++++----- .../sponge/parser/ResourceKeyParser.java | 10 +++---- .../sponge/parser/ResourceKeyUtil.java | 2 +- .../parser/SingleEntitySelectorParser.java | 16 +++++----- .../parser/SinglePlayerSelectorParser.java | 16 +++++----- .../sponge/parser/UserParser.java | 22 +++++++------- .../sponge/parser/Vector2dParser.java | 14 ++++----- .../sponge/parser/Vector2iParser.java | 16 +++++----- .../sponge/parser/Vector3dParser.java | 14 ++++----- .../sponge/parser/Vector3iParser.java | 16 +++++----- .../sponge/parser/VectorParser.java | 4 +-- .../sponge/parser/WorldParser.java | 12 ++++---- .../sponge/suggestion/SpongeSuggestion.java | 4 +-- .../examples/sponge/CloudExamplePlugin.java | 26 ++++++++-------- 38 files changed, 256 insertions(+), 256 deletions(-) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java index 4b673a0c..8852e012 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java @@ -23,13 +23,13 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.SenderMapper; -import cloud.commandframework.execution.ExecutionCoordinator; import com.google.inject.AbstractModule; import com.google.inject.Key; import com.google.inject.util.Types; import java.lang.reflect.Type; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.execution.ExecutionCoordinator; import org.spongepowered.api.command.CommandCause; /** diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java index 145af35a..310ebc3a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java @@ -23,12 +23,6 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandComponent; -import cloud.commandframework.arguments.LiteralParser; -import cloud.commandframework.arguments.aggregate.AggregateParser; -import cloud.commandframework.internal.CommandNode; -import cloud.commandframework.permission.Permission; -import cloud.commandframework.types.tuples.Pair; import java.util.ArrayDeque; import java.util.Collections; import java.util.List; @@ -37,6 +31,12 @@ import java.util.stream.Collectors; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.internal.CommandNode; +import org.incendo.cloud.parser.aggregate.AggregateParser; +import org.incendo.cloud.parser.standard.LiteralParser; +import org.incendo.cloud.permission.Permission; +import org.incendo.cloud.type.tuple.Pair; import org.spongepowered.api.command.Command; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.CommandCompletion; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java index a69957d5..df34fe5b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java @@ -23,12 +23,11 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.arguments.parser.ArgumentParser; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; /** - * Implemented by {@link ArgumentParser} which also supply a special {@link CommandTreeNode.Argument}. + * Implemented by {@link org.incendo.cloud.parser.ArgumentParser} which also supply a special {@link CommandTreeNode.Argument}. */ public interface NodeSource { diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java index 97d275d3..c3cd2743 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java @@ -23,11 +23,11 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.captions.Caption; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.Caption; /** * {@link Caption} instances for messages in cloud-sponge. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java index c3e2f5eb..366e48f3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java @@ -23,17 +23,17 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.keys.CloudKey; import io.leangen.geantyref.TypeToken; +import org.incendo.cloud.key.CloudKey; import org.spongepowered.api.command.CommandCause; /** - * Sponge related {@link cloud.commandframework.context.CommandContext} keys. + * Sponge related {@link org.incendo.cloud.context.CommandContext} keys. */ public final class SpongeCommandContextKeys { /** - * The Sponge native {@link org.spongepowered.api.command.CommandCause} instance is stored in the {@link cloud.commandframework.context.CommandContext} + * The Sponge native {@link org.spongepowered.api.command.CommandCause} instance is stored in the {@link org.incendo.cloud.context.CommandContext} * by {@link SpongeCommandPreprocessor} */ public static final CloudKey COMMAND_CAUSE = CloudKey.of( diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java index 27568949..4fba2de4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java @@ -23,20 +23,11 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandManager; -import cloud.commandframework.SenderMapper; -import cloud.commandframework.SenderMapperHolder; -import cloud.commandframework.arguments.parser.ParserParameters; -import cloud.commandframework.arguments.suggestion.SuggestionFactory; -import cloud.commandframework.execution.ExecutionCoordinator; -import cloud.commandframework.meta.CommandMeta; -import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.sponge.annotation.specifier.Center; import cloud.commandframework.sponge.parser.RegistryEntryParser; import cloud.commandframework.sponge.parser.Vector2dParser; import cloud.commandframework.sponge.parser.Vector3dParser; import cloud.commandframework.sponge.suggestion.SpongeSuggestion; -import cloud.commandframework.state.RegistrationState; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Module; @@ -48,6 +39,15 @@ import java.util.Set; import java.util.function.Consumer; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.SenderMapperHolder; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.meta.CommandMeta; +import org.incendo.cloud.meta.SimpleCommandMeta; +import org.incendo.cloud.parser.ParserParameters; +import org.incendo.cloud.state.RegistrationState; +import org.incendo.cloud.suggestion.SuggestionFactory; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; @@ -231,7 +231,7 @@ public boolean hasPermission( /** * Get the {@link SpongeParserMapper}, responsible for mapping Cloud - * {@link cloud.commandframework.arguments.parser.ArgumentParser ArgumentParser} to Sponge + * {@link org.incendo.cloud.parser.ArgumentParser ArgumentParser} to Sponge * {@link org.spongepowered.api.command.registrar.tree.CommandTreeNode.Argument CommandTreeNode.Arguments}. * * @return the parser mapper diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java index 518913e4..aa29da32 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java @@ -23,14 +23,14 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; -import cloud.commandframework.execution.preprocessor.CommandPreprocessor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.execution.preprocessor.CommandPreprocessingContext; +import org.incendo.cloud.execution.preprocessor.CommandPreprocessor; import org.spongepowered.api.command.CommandCause; /** - * Command preprocessor which decorates incoming {@link cloud.commandframework.context.CommandContext} + * Command preprocessor which decorates incoming {@link org.incendo.cloud.context.CommandContext} * with Sponge specific objects * * @param Command sender type diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java index d0cb3a83..3ab84c83 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java @@ -23,9 +23,9 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.captions.CaptionProvider; -import cloud.commandframework.captions.DelegatingCaptionProvider; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionProvider; +import org.incendo.cloud.caption.DelegatingCaptionProvider; /** * Provides the default captions for messages in cloud-sponge. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java index 597faffb..13c8adea 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java @@ -23,18 +23,18 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.exceptions.ArgumentParseException; -import cloud.commandframework.exceptions.CommandExecutionException; -import cloud.commandframework.exceptions.InvalidCommandSenderException; -import cloud.commandframework.exceptions.InvalidSyntaxException; -import cloud.commandframework.exceptions.NoPermissionException; -import cloud.commandframework.exceptions.NoSuchCommandException; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.util.ComponentMessageThrowable; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.DefaultQualifier; +import org.incendo.cloud.exception.ArgumentParseException; +import org.incendo.cloud.exception.CommandExecutionException; +import org.incendo.cloud.exception.InvalidCommandSenderException; +import org.incendo.cloud.exception.InvalidSyntaxException; +import org.incendo.cloud.exception.NoPermissionException; +import org.incendo.cloud.exception.NoSuchCommandException; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java index acf7a03f..08be9d3f 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java @@ -23,20 +23,6 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandComponent; -import cloud.commandframework.arguments.flags.CommandFlagParser; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.MappedArgumentParser; -import cloud.commandframework.arguments.standard.BooleanParser; -import cloud.commandframework.arguments.standard.ByteParser; -import cloud.commandframework.arguments.standard.DoubleParser; -import cloud.commandframework.arguments.standard.FloatParser; -import cloud.commandframework.arguments.standard.IntegerParser; -import cloud.commandframework.arguments.standard.LongParser; -import cloud.commandframework.arguments.standard.ShortParser; -import cloud.commandframework.arguments.standard.StringArrayParser; -import cloud.commandframework.arguments.standard.StringParser; -import cloud.commandframework.arguments.standard.UUIDParser; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; import java.util.HashMap; @@ -44,13 +30,27 @@ import java.util.function.Consumer; import java.util.function.Function; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.MappedArgumentParser; +import org.incendo.cloud.parser.flag.CommandFlagParser; +import org.incendo.cloud.parser.standard.BooleanParser; +import org.incendo.cloud.parser.standard.ByteParser; +import org.incendo.cloud.parser.standard.DoubleParser; +import org.incendo.cloud.parser.standard.FloatParser; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.parser.standard.LongParser; +import org.incendo.cloud.parser.standard.ShortParser; +import org.incendo.cloud.parser.standard.StringArrayParser; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.parser.standard.UUIDParser; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import static java.util.Objects.requireNonNull; /** - * Class responsible for mapping Cloud {@link ArgumentParser ArgumentParsers} to Sponge + * Class responsible for mapping Cloud {@link org.incendo.cloud.parser.ArgumentParser ArgumentParsers} to Sponge * {@link CommandTreeNode.Argument CommandTreeNode.Arguments}. * * @param command sender type diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java index 45cbf6db..5919815f 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java @@ -23,9 +23,9 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.arguments.parser.ParserParameter; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.parser.ParserParameter; /** * {@link ParserParameter} keys for cloud-sponge. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java index 7669e743..f7bc5cec 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java @@ -23,21 +23,21 @@ // package cloud.commandframework.sponge; -import cloud.commandframework.CommandComponent; -import cloud.commandframework.arguments.aggregate.AggregateParser; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.EitherParser; -import cloud.commandframework.arguments.parser.MappedArgumentParser; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.internal.CommandNode; -import cloud.commandframework.internal.CommandRegistrationHandler; -import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import io.leangen.geantyref.TypeToken; import java.util.HashSet; import java.util.Set; import net.minecraft.commands.CommandBuildContext; import net.minecraft.server.MinecraftServer; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.internal.CommandNode; +import org.incendo.cloud.internal.CommandRegistrationHandler; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.MappedArgumentParser; +import org.incendo.cloud.parser.aggregate.AggregateParser; +import org.incendo.cloud.parser.standard.EitherParser; import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; @@ -51,7 +51,7 @@ final class SpongeRegistrationHandler implements CommandRegistrationHandler { private SpongeCommandManager commandManager; - private final Set> registeredCommands = new HashSet<>(); + private final Set> registeredCommands = new HashSet<>(); SpongeRegistrationHandler() { } @@ -80,7 +80,7 @@ private void startedEngine(final StartedEngineEvent serverStartedEngineE CommandBuildContext.configurable(engine.registryAccess(), engine.getWorldData().enabledFeatures()), true, () -> { - for (final cloud.commandframework.Command registeredCommand : this.registeredCommands) { + for (final org.incendo.cloud.Command registeredCommand : this.registeredCommands) { for (final CommandComponent component : registeredCommand.components()) { if (component.type() == CommandComponent.ComponentType.LITERAL || component.type() == CommandComponent.ComponentType.FLAG) { @@ -117,7 +117,7 @@ void initialize(final @NonNull SpongeCommandManager commandManager) { } @Override - public boolean registerCommand(final cloud.commandframework.@NonNull Command command) { + public boolean registerCommand(final org.incendo.cloud.@NonNull Command command) { this.registeredCommands.add(command); return true; } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java index b436b4a3..12fbee62 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java @@ -23,15 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.BlockInput; import java.lang.reflect.Field; @@ -42,6 +33,15 @@ import net.minecraft.server.level.ServerLevel; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.block.BlockState; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java index e1062ebc..83a4d1f4 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java @@ -23,22 +23,23 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.BlockPredicate; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.pattern.BlockInWorld; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.world.server.ServerLocation; @@ -63,7 +64,7 @@ public static ParserDescriptor blockPredicateParser() { } private final ArgumentParser mappedParser = - new WrappedBrigadierParser( + new WrappedBrigadierParser( new ContextualArgumentTypeProvider<>(net.minecraft.commands.arguments.blocks.BlockPredicateArgument::blockPredicate) ).flatMapSuccess((ctx, result) -> ArgumentParseResult.successFuture(new BlockPredicateImpl(result))); diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java index 1b678970..544bc91c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java @@ -23,18 +23,18 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import java.util.concurrent.CompletableFuture; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.adventure.SpongeAdventure; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java index 65138a4f..5c6e82f9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java @@ -23,19 +23,19 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.arguments.CompoundTagArgument; import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.data.persistence.DataContainer; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java index 32d4f3c5..cc0f9b5e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.GameProfileCollection; @@ -46,6 +38,14 @@ import net.minecraft.commands.arguments.GameProfileArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.framework.qual.DefaultQualifier; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java index c0773b16..fdb89c7b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java @@ -23,15 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.exceptions.parsing.ParserException; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCaptionKeys; import cloud.commandframework.sponge.SpongeCommandContextKeys; @@ -40,6 +31,15 @@ import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.exception.parsing.ParserException; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java index eefaabf9..bee02bfd 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java @@ -23,21 +23,21 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.ItemStackPredicate; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import net.minecraft.commands.arguments.item.ItemPredicateArgument; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.item.inventory.ItemStack; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java index c44a71e5..78d9be5b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultipleEntitySelector; @@ -43,6 +35,14 @@ import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java index 15f8c578..b918e7e1 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.MultiplePlayerSelector; @@ -43,6 +35,14 @@ import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java index 6aea7215..d4dbbf4c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java @@ -23,18 +23,18 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import java.util.ArrayList; import java.util.Locale; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.commands.arguments.ColorArgument; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java index f6ca6caa..19a6d6d5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java @@ -23,18 +23,18 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.lang.reflect.Method; import java.util.Optional; import java.util.stream.Collectors; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java index c71d4491..751be192 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java @@ -23,15 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.minecraft.modded.internal.ContextualArgumentTypeProvider; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; @@ -45,6 +36,15 @@ import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.data.persistence.DataContainer; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java index f5b69a76..95f45053 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; -import cloud.commandframework.captions.CaptionVariable; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.exceptions.parsing.ParserException; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCaptionKeys; import io.leangen.geantyref.TypeToken; @@ -41,6 +33,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.exception.parsing.ParserException; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.command.registrar.tree.CommandCompletionProviders; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java index 6fdabe2b..4cb32a76 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java @@ -23,13 +23,13 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java index 73153b60..1c2e9ab0 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java @@ -23,13 +23,13 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.lang.reflect.Field; import java.util.Arrays; import net.minecraft.resources.ResourceLocation; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.parser.ArgumentParseResult; import org.spongepowered.api.ResourceKey; /** diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java index a1317cef..5d3258db 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SingleEntitySelector; @@ -40,6 +32,14 @@ import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java index 4c6c374a..c9e18602 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import cloud.commandframework.sponge.data.SinglePlayerSelector; @@ -40,6 +32,14 @@ import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.api.command.selector.Selector; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java index e30fd408..d11c1bbb 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java @@ -23,17 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.captions.Caption; -import cloud.commandframework.captions.CaptionVariable; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; -import cloud.commandframework.exceptions.parsing.ParserException; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCaptionKeys; import cloud.commandframework.sponge.SpongeCommandContextKeys; @@ -49,6 +38,17 @@ import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.caption.Caption; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.exception.parsing.ParserException; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java index 5a970706..a0bc9ba6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java @@ -23,13 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; @@ -37,6 +30,13 @@ import net.minecraft.commands.arguments.coordinates.Vec2Argument; import net.minecraft.world.phys.Vec3; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2d; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java index 9840a949..0cd422b1 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; @@ -39,6 +31,14 @@ import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.core.BlockPos; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.math.vector.Vector2i; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java index 5a5deb57..1bacd06c 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java @@ -23,19 +23,19 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.commands.arguments.coordinates.Vec3Argument; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.util.VecHelper; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java index a470638d..3478306a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java @@ -23,14 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; -import cloud.commandframework.brigadier.parser.WrappedBrigadierParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; @@ -38,6 +30,14 @@ import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.commands.arguments.coordinates.Coordinates; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; import org.spongepowered.common.util.VecHelper; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java index 94e3cc30..802a4c73 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java @@ -23,9 +23,9 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.suggestion.SuggestionProvider; import cloud.commandframework.sponge.NodeSource; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.suggestion.SuggestionProvider; /** * Parent of {@link Vector3dParser} and {@link Vector2dParser} containing shared methods. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java index 906178f0..a7cc6212 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java @@ -23,12 +23,6 @@ // package cloud.commandframework.sponge.parser; -import cloud.commandframework.arguments.parser.ArgumentParseResult; -import cloud.commandframework.arguments.parser.ArgumentParser; -import cloud.commandframework.arguments.parser.ParserDescriptor; -import cloud.commandframework.arguments.suggestion.BlockingSuggestionProvider; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.context.CommandInput; import cloud.commandframework.sponge.NodeSource; import com.google.common.base.Suppliers; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; @@ -41,6 +35,12 @@ import java.util.stream.Stream; import net.minecraft.commands.arguments.DimensionArgument; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java index a7bf6982..c47bf0f9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java +++ b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java @@ -23,13 +23,13 @@ // package cloud.commandframework.sponge.suggestion; -import cloud.commandframework.arguments.suggestion.Suggestion; -import cloud.commandframework.brigadier.suggestion.TooltipSuggestion; import java.util.Optional; import net.kyori.adventure.text.Component; import net.minecraft.network.chat.ComponentUtils; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.brigadier.suggestion.TooltipSuggestion; +import org.incendo.cloud.suggestion.Suggestion; import org.spongepowered.common.adventure.SpongeAdventure; /** diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java index c00afc4e..bb2f2dbf 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java @@ -23,14 +23,6 @@ // package cloud.commandframework.examples.sponge; -import cloud.commandframework.Command; -import cloud.commandframework.Description; -import cloud.commandframework.arguments.DefaultValue; -import cloud.commandframework.arguments.standard.StringParser; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.execution.ExecutionCoordinator; -import cloud.commandframework.minecraft.extras.MinecraftExceptionHandler; -import cloud.commandframework.permission.PredicatePermission; import cloud.commandframework.sponge.CloudInjectionModule; import cloud.commandframework.sponge.SpongeCommandManager; import cloud.commandframework.sponge.data.BlockInput; @@ -39,7 +31,6 @@ import cloud.commandframework.sponge.data.MultipleEntitySelector; import cloud.commandframework.sponge.data.ProtoItemStack; import cloud.commandframework.sponge.data.SinglePlayerSelector; -import cloud.commandframework.types.tuples.Pair; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; @@ -51,6 +42,15 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.component.DefaultValue; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.description.Description; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.permission.PredicatePermission; +import org.incendo.cloud.type.tuple.Pair; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; @@ -84,10 +84,6 @@ import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.builtin.jvm.Plugin; -import static cloud.commandframework.arguments.standard.DoubleParser.doubleParser; -import static cloud.commandframework.arguments.standard.IntegerParser.integerParser; -import static cloud.commandframework.arguments.standard.StringParser.greedyStringParser; -import static cloud.commandframework.arguments.standard.StringParser.stringParser; import static cloud.commandframework.sponge.parser.BlockInputParser.blockInputParser; import static cloud.commandframework.sponge.parser.BlockPredicateParser.blockPredicateParser; import static cloud.commandframework.sponge.parser.DataContainerParser.dataContainerParser; @@ -112,6 +108,10 @@ import static net.kyori.adventure.text.format.NamedTextColor.LIGHT_PURPLE; import static net.kyori.adventure.text.format.NamedTextColor.RED; import static net.kyori.adventure.text.format.TextColor.color; +import static org.incendo.cloud.parser.standard.DoubleParser.doubleParser; +import static org.incendo.cloud.parser.standard.IntegerParser.integerParser; +import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser; +import static org.incendo.cloud.parser.standard.StringParser.stringParser; @Plugin("cloud-example-sponge") public final class CloudExamplePlugin { From 1e100bcf9b2ae4e871f28ff438e4f2bfeafc6777 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 24 Jan 2024 19:05:29 -0700 Subject: [PATCH 65/72] Repackage to org.incendo.cloud --- .../sponge/suggestion/package-info.java | 4 - .../cloud}/sponge/CloudInjectionModule.java | 2 +- .../cloud}/sponge/CloudSpongeCommand.java | 2 +- .../incendo/cloud}/sponge/NodeSource.java | 2 +- .../cloud}/sponge/SpongeCaptionKeys.java | 2 +- .../sponge/SpongeCommandContextKeys.java | 2 +- .../cloud}/sponge/SpongeCommandManager.java | 89 +++++++++---------- .../sponge/SpongeCommandPreprocessor.java | 2 +- .../sponge/SpongeDefaultCaptionsProvider.java | 2 +- .../SpongeDefaultExceptionHandlers.java | 2 +- .../cloud}/sponge/SpongeParserMapper.java | 2 +- .../cloud}/sponge/SpongeParserParameters.java | 2 +- .../sponge/SpongeRegistrationHandler.java | 2 +- .../sponge/annotation/package-info.java | 2 +- .../sponge/annotation/specifier/Center.java | 6 +- .../annotation/specifier/package-info.java | 2 +- .../cloud}/sponge/data/BlockInput.java | 2 +- .../cloud}/sponge/data/BlockPredicate.java | 2 +- .../sponge/data/GameProfileCollection.java | 2 +- .../sponge/data/ItemStackPredicate.java | 2 +- .../sponge/data/MultipleEntitySelector.java | 2 +- .../sponge/data/MultiplePlayerSelector.java | 2 +- .../cloud}/sponge/data/ProtoItemStack.java | 4 +- .../cloud}/sponge/data/SelectorWrapper.java | 2 +- .../sponge/data/SingleEntitySelector.java | 2 +- .../sponge/data/SinglePlayerSelector.java | 2 +- .../cloud}/sponge/data/package-info.java | 2 +- .../ComponentMessageRuntimeException.java | 2 +- .../cloud}/sponge/exception/package-info.java | 2 +- .../incendo/cloud}/sponge/package-info.java | 2 +- .../sponge/parser/BlockInputParser.java | 6 +- .../sponge/parser/BlockPredicateParser.java | 6 +- .../cloud}/sponge/parser/ComponentParser.java | 4 +- .../sponge/parser/DataContainerParser.java | 4 +- .../parser/GameProfileCollectionParser.java | 8 +- .../sponge/parser/GameProfileParser.java | 8 +- .../parser/ItemStackPredicateParser.java | 6 +- .../parser/MultipleEntitySelectorParser.java | 8 +- .../parser/MultiplePlayerSelectorParser.java | 8 +- .../sponge/parser/NamedTextColorParser.java | 4 +- .../cloud}/sponge/parser/OperatorParser.java | 4 +- .../sponge/parser/ProtoItemStackParser.java | 8 +- .../sponge/parser/RegistryEntryParser.java | 6 +- .../sponge/parser/ResourceKeyParser.java | 4 +- .../cloud}/sponge/parser/ResourceKeyUtil.java | 2 +- .../parser/SingleEntitySelectorParser.java | 8 +- .../parser/SinglePlayerSelectorParser.java | 8 +- .../cloud}/sponge/parser/UserParser.java | 8 +- .../cloud}/sponge/parser/Vector2dParser.java | 4 +- .../cloud}/sponge/parser/Vector2iParser.java | 6 +- .../cloud}/sponge/parser/Vector3dParser.java | 4 +- .../cloud}/sponge/parser/Vector3iParser.java | 6 +- .../cloud}/sponge/parser/VectorParser.java | 4 +- .../cloud}/sponge/parser/WorldParser.java | 4 +- .../cloud}/sponge/parser/package-info.java | 2 +- .../sponge/suggestion/SpongeSuggestion.java | 2 +- .../suggestion/SpongeSuggestionImpl.java | 2 +- .../cloud/sponge/suggestion/package-info.java | 4 + .../examples/sponge/CloudExamplePlugin.java | 44 ++++----- .../cloud}/examples/sponge/package-info.java | 2 +- 60 files changed, 174 insertions(+), 175 deletions(-) delete mode 100644 cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/CloudInjectionModule.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/CloudSpongeCommand.java (99%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/NodeSource.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeCaptionKeys.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeCommandContextKeys.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeCommandManager.java (75%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeCommandPreprocessor.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeDefaultCaptionsProvider.java (99%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeDefaultExceptionHandlers.java (99%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeParserMapper.java (99%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeParserParameters.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/SpongeRegistrationHandler.java (99%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/annotation/package-info.java (95%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/annotation/specifier/Center.java (89%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/annotation/specifier/package-info.java (95%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/BlockInput.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/BlockPredicate.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/GameProfileCollection.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/ItemStackPredicate.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/MultipleEntitySelector.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/MultiplePlayerSelector.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/ProtoItemStack.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/SelectorWrapper.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/SingleEntitySelector.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/SinglePlayerSelector.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/data/package-info.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/exception/ComponentMessageRuntimeException.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/exception/package-info.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/package-info.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/BlockInputParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/BlockPredicateParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/ComponentParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/DataContainerParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/GameProfileCollectionParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/GameProfileParser.java (95%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/ItemStackPredicateParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/MultipleEntitySelectorParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/MultiplePlayerSelectorParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/NamedTextColorParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/OperatorParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/ProtoItemStackParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/RegistryEntryParser.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/ResourceKeyParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/ResourceKeyUtil.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/SingleEntitySelectorParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/SinglePlayerSelectorParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/UserParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/Vector2dParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/Vector2iParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/Vector3dParser.java (97%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/Vector3iParser.java (96%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/VectorParser.java (95%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/WorldParser.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/parser/package-info.java (51%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/suggestion/SpongeSuggestion.java (98%) rename cloud-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/sponge/suggestion/SpongeSuggestionImpl.java (96%) create mode 100644 cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/package-info.java rename examples/example-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/examples/sponge/CloudExamplePlugin.java (92%) rename examples/example-sponge/src/main/java/{cloud/commandframework => org/incendo/cloud}/examples/sponge/package-info.java (96%) diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java b/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java deleted file mode 100644 index 0891f3c2..00000000 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Sponge suggestion related classes. - */ -package cloud.commandframework.sponge.suggestion; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudInjectionModule.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudInjectionModule.java index 8852e012..242c75e0 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudInjectionModule.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudInjectionModule.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import com.google.inject.AbstractModule; import com.google.inject.Key; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java similarity index 99% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java index 310ebc3a..bd863e6b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import java.util.ArrayDeque; import java.util.Collections; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/NodeSource.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/NodeSource.java index df34fe5b..dcd55871 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/NodeSource.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/NodeSource.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCaptionKeys.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCaptionKeys.java index c3cd2743..0f02f3d5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCaptionKeys.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCaptionKeys.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import java.util.Collection; import java.util.Collections; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandContextKeys.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandContextKeys.java index 366e48f3..f2fcbc44 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandContextKeys.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandContextKeys.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import io.leangen.geantyref.TypeToken; import org.incendo.cloud.key.CloudKey; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandManager.java similarity index 75% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandManager.java index 4fba2de4..fca8f492 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandManager.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandManager.java @@ -21,13 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; -import cloud.commandframework.sponge.annotation.specifier.Center; -import cloud.commandframework.sponge.parser.RegistryEntryParser; -import cloud.commandframework.sponge.parser.Vector2dParser; -import cloud.commandframework.sponge.parser.Vector3dParser; -import cloud.commandframework.sponge.suggestion.SpongeSuggestion; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Module; @@ -46,6 +41,30 @@ import org.incendo.cloud.meta.CommandMeta; import org.incendo.cloud.meta.SimpleCommandMeta; import org.incendo.cloud.parser.ParserParameters; +import org.incendo.cloud.sponge.annotation.specifier.Center; +import org.incendo.cloud.sponge.parser.BlockInputParser; +import org.incendo.cloud.sponge.parser.BlockPredicateParser; +import org.incendo.cloud.sponge.parser.ComponentParser; +import org.incendo.cloud.sponge.parser.DataContainerParser; +import org.incendo.cloud.sponge.parser.GameProfileCollectionParser; +import org.incendo.cloud.sponge.parser.GameProfileParser; +import org.incendo.cloud.sponge.parser.ItemStackPredicateParser; +import org.incendo.cloud.sponge.parser.MultipleEntitySelectorParser; +import org.incendo.cloud.sponge.parser.MultiplePlayerSelectorParser; +import org.incendo.cloud.sponge.parser.NamedTextColorParser; +import org.incendo.cloud.sponge.parser.OperatorParser; +import org.incendo.cloud.sponge.parser.ProtoItemStackParser; +import org.incendo.cloud.sponge.parser.RegistryEntryParser; +import org.incendo.cloud.sponge.parser.ResourceKeyParser; +import org.incendo.cloud.sponge.parser.SingleEntitySelectorParser; +import org.incendo.cloud.sponge.parser.SinglePlayerSelectorParser; +import org.incendo.cloud.sponge.parser.UserParser; +import org.incendo.cloud.sponge.parser.Vector2dParser; +import org.incendo.cloud.sponge.parser.Vector2iParser; +import org.incendo.cloud.sponge.parser.Vector3dParser; +import org.incendo.cloud.sponge.parser.Vector3iParser; +import org.incendo.cloud.sponge.parser.WorldParser; +import org.incendo.cloud.sponge.suggestion.SpongeSuggestion; import org.incendo.cloud.state.RegistrationState; import org.incendo.cloud.suggestion.SuggestionFactory; import org.spongepowered.api.Sponge; @@ -59,26 +78,6 @@ import org.spongepowered.math.vector.Vector3d; import org.spongepowered.plugin.PluginContainer; -import static cloud.commandframework.sponge.parser.BlockInputParser.blockInputParser; -import static cloud.commandframework.sponge.parser.BlockPredicateParser.blockPredicateParser; -import static cloud.commandframework.sponge.parser.ComponentParser.componentParser; -import static cloud.commandframework.sponge.parser.DataContainerParser.dataContainerParser; -import static cloud.commandframework.sponge.parser.GameProfileCollectionParser.gameProfileCollectionParser; -import static cloud.commandframework.sponge.parser.GameProfileParser.gameProfileParser; -import static cloud.commandframework.sponge.parser.ItemStackPredicateParser.itemStackPredicateParser; -import static cloud.commandframework.sponge.parser.MultipleEntitySelectorParser.multipleEntitySelectorParser; -import static cloud.commandframework.sponge.parser.MultiplePlayerSelectorParser.multiplePlayerSelectorParser; -import static cloud.commandframework.sponge.parser.NamedTextColorParser.namedTextColorParser; -import static cloud.commandframework.sponge.parser.OperatorParser.operatorParser; -import static cloud.commandframework.sponge.parser.ProtoItemStackParser.protoItemStackParser; -import static cloud.commandframework.sponge.parser.ResourceKeyParser.resourceKeyParser; -import static cloud.commandframework.sponge.parser.SingleEntitySelectorParser.singleEntitySelectorParser; -import static cloud.commandframework.sponge.parser.SinglePlayerSelectorParser.singlePlayerSelectorParser; -import static cloud.commandframework.sponge.parser.UserParser.userParser; -import static cloud.commandframework.sponge.parser.Vector2iParser.vector2iParser; -import static cloud.commandframework.sponge.parser.Vector3iParser.vector3iParser; -import static cloud.commandframework.sponge.parser.WorldParser.worldParser; - /** * Command manager for Sponge API v8. *

    @@ -140,19 +139,19 @@ private void checkLateCreation() { private void registerParsers() { this.parserRegistry() - .registerParser(componentParser()) - .registerParser(namedTextColorParser()) - .registerParser(operatorParser()) - .registerParser(worldParser()) - .registerParser(protoItemStackParser()) - .registerParser(itemStackPredicateParser()) - .registerParser(resourceKeyParser()) - .registerParser(gameProfileParser()) - .registerParser(gameProfileCollectionParser()) - .registerParser(blockInputParser()) - .registerParser(blockPredicateParser()) - .registerParser(userParser()) - .registerParser(dataContainerParser()) + .registerParser(ComponentParser.componentParser()) + .registerParser(NamedTextColorParser.namedTextColorParser()) + .registerParser(OperatorParser.operatorParser()) + .registerParser(WorldParser.worldParser()) + .registerParser(ProtoItemStackParser.protoItemStackParser()) + .registerParser(ItemStackPredicateParser.itemStackPredicateParser()) + .registerParser(ResourceKeyParser.resourceKeyParser()) + .registerParser(GameProfileParser.gameProfileParser()) + .registerParser(GameProfileCollectionParser.gameProfileCollectionParser()) + .registerParser(BlockInputParser.blockInputParser()) + .registerParser(BlockPredicateParser.blockPredicateParser()) + .registerParser(UserParser.userParser()) + .registerParser(DataContainerParser.dataContainerParser()) .registerAnnotationMapper( Center.class, (annotation, type) -> ParserParameters.single(SpongeParserParameters.CENTER_INTEGERS, true) @@ -165,12 +164,12 @@ private void registerParsers() { TypeToken.get(Vector3d.class), params -> new Vector3dParser<>(params.get(SpongeParserParameters.CENTER_INTEGERS, false)) ) - .registerParser(vector2iParser()) - .registerParser(vector3iParser()) - .registerParser(singlePlayerSelectorParser()) - .registerParser(multiplePlayerSelectorParser()) - .registerParser(singleEntitySelectorParser()) - .registerParser(multipleEntitySelectorParser()); + .registerParser(Vector2iParser.vector2iParser()) + .registerParser(Vector3iParser.vector3iParser()) + .registerParser(SinglePlayerSelectorParser.singlePlayerSelectorParser()) + .registerParser(MultiplePlayerSelectorParser.multiplePlayerSelectorParser()) + .registerParser(SingleEntitySelectorParser.singleEntitySelectorParser()) + .registerParser(MultipleEntitySelectorParser.multipleEntitySelectorParser()); this.registerRegistryParsers(); } diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandPreprocessor.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandPreprocessor.java index aa29da32..70149772 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeCommandPreprocessor.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandPreprocessor.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultCaptionsProvider.java similarity index 99% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultCaptionsProvider.java index 3ab84c83..cb6770be 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultCaptionsProvider.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultCaptionsProvider.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.caption.CaptionProvider; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultExceptionHandlers.java similarity index 99% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultExceptionHandlers.java index 13c8adea..9e49e5f5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeDefaultExceptionHandlers.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeDefaultExceptionHandlers.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserMapper.java similarity index 99% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserMapper.java index 08be9d3f..d816d6f7 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserMapper.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserMapper.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserParameters.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserParameters.java index 5919815f..fe14fff7 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeParserParameters.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserParameters.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java similarity index 99% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java index f7bc5cec..9f4edd29 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; import io.leangen.geantyref.TypeToken; import java.util.HashSet; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/package-info.java similarity index 95% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/package-info.java index 3019c7a4..2bd372f6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/package-info.java @@ -24,4 +24,4 @@ /** * Annotations for cloud-sponge. */ -package cloud.commandframework.sponge.annotation; +package org.incendo.cloud.sponge.annotation; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/Center.java similarity index 89% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/Center.java index 7200b904..e347bf09 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/Center.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/Center.java @@ -21,14 +21,14 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.annotation.specifier; +package org.incendo.cloud.sponge.annotation.specifier; -import cloud.commandframework.sponge.parser.Vector2dParser; -import cloud.commandframework.sponge.parser.Vector3dParser; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.incendo.cloud.sponge.parser.Vector2dParser; +import org.incendo.cloud.sponge.parser.Vector3dParser; /** * Annotation used to enable coordinate centering for {@link Vector3dParser} and {@link Vector2dParser}. diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/package-info.java similarity index 95% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/package-info.java index 765e84c1..182e4f7f 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/annotation/specifier/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/annotation/specifier/package-info.java @@ -24,4 +24,4 @@ /** * Specifier annotations for cloud-sponge. */ -package cloud.commandframework.sponge.annotation.specifier; +package org.incendo.cloud.sponge.annotation.specifier; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockInput.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockInput.java index 10c0a51c..987dc8d2 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockInput.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockInput.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockPredicate.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockPredicate.java index 7478bfc4..b3dc3c79 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/BlockPredicate.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/BlockPredicate.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import java.util.function.Predicate; import org.checkerframework.checker.nullness.qual.NonNull; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/GameProfileCollection.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/GameProfileCollection.java index 0cd9f30e..0602d135 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/GameProfileCollection.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/GameProfileCollection.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import java.util.Collection; import org.spongepowered.api.profile.GameProfile; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ItemStackPredicate.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ItemStackPredicate.java index 00ae457c..a52a3fe6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ItemStackPredicate.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ItemStackPredicate.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import java.util.function.Predicate; import org.spongepowered.api.item.inventory.ItemStack; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultipleEntitySelector.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultipleEntitySelector.java index 28eceb85..72b420e9 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultipleEntitySelector.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultipleEntitySelector.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import org.spongepowered.api.entity.Entity; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultiplePlayerSelector.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultiplePlayerSelector.java index 7d45b52b..707b5c25 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/MultiplePlayerSelector.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/MultiplePlayerSelector.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import org.spongepowered.api.entity.living.player.server.ServerPlayer; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ProtoItemStack.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ProtoItemStack.java index 862e351b..e8c14be3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/ProtoItemStack.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ProtoItemStack.java @@ -21,11 +21,11 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; -import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.sponge.exception.ComponentMessageRuntimeException; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.inventory.ItemStack; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SelectorWrapper.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SelectorWrapper.java index 3e64d994..c1c08268 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SelectorWrapper.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SelectorWrapper.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import java.util.Collection; import java.util.Collections; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SingleEntitySelector.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SingleEntitySelector.java index 2773863e..024eeeba 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SingleEntitySelector.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SingleEntitySelector.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import org.spongepowered.api.entity.Entity; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SinglePlayerSelector.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SinglePlayerSelector.java index 46523c8d..e673366d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/SinglePlayerSelector.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/SinglePlayerSelector.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; import org.spongepowered.api.entity.living.player.server.ServerPlayer; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/package-info.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/package-info.java index 2f04885c..4f838515 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/data/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/package-info.java @@ -24,4 +24,4 @@ /** * Data holders for cloud-sponge. */ -package cloud.commandframework.sponge.data; +package org.incendo.cloud.sponge.data; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/ComponentMessageRuntimeException.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/ComponentMessageRuntimeException.java index 4769bbc9..021bbf44 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/ComponentMessageRuntimeException.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/ComponentMessageRuntimeException.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.exception; +package org.incendo.cloud.sponge.exception; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/package-info.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/package-info.java index 0ceaaf45..04622cea 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/exception/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/exception/package-info.java @@ -24,4 +24,4 @@ /** * Exception types for cloud-sponge. */ -package cloud.commandframework.sponge.exception; +package org.incendo.cloud.sponge.exception; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/package-info.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/package-info.java index 9a7e0cdc..c3db0785 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/package-info.java @@ -24,4 +24,4 @@ /** * Cloud for Sponge 8 */ -package cloud.commandframework.sponge; +package org.incendo.cloud.sponge; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java index 12fbee62..fb4f2c51 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.data.BlockInput; import java.lang.reflect.Field; import java.util.Arrays; import java.util.concurrent.CompletableFuture; @@ -40,6 +38,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.data.BlockInput; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.block.BlockState; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java index 83a4d1f4..75632fcd 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.data.BlockPredicate; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import net.minecraft.commands.arguments.blocks.BlockPredicateArgument; @@ -38,6 +36,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.data.BlockPredicate; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java index 544bc91c..041c59b5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import java.util.concurrent.CompletableFuture; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.NonNull; @@ -33,6 +32,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java index 5c6e82f9..6364fb93 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.arguments.CompoundTagArgument; import net.minecraft.nbt.CompoundTag; @@ -34,6 +33,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java index cc0f9b5e..6096e698 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.GameProfileCollection; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.AbstractCollection; import java.util.Collection; @@ -44,6 +41,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; +import org.incendo.cloud.sponge.data.GameProfileCollection; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java similarity index 95% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java index fdb89c7b..46b9696a 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCaptionKeys; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.Collection; import java.util.concurrent.CompletableFuture; @@ -38,6 +35,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCaptionKeys; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java index bee02bfd..1b748ba3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.data.ItemStackPredicate; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import net.minecraft.commands.arguments.item.ItemPredicateArgument; @@ -36,6 +34,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.data.ItemStackPredicate; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java index 78d9be5b..54fa1f7d 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.MultipleEntitySelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.Collection; import java.util.List; @@ -41,6 +38,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; +import org.incendo.cloud.sponge.data.MultipleEntitySelector; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java index b918e7e1..d52fc7e6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.MultiplePlayerSelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.Collection; import java.util.List; @@ -41,6 +38,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; +import org.incendo.cloud.sponge.data.MultiplePlayerSelector; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/NamedTextColorParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/NamedTextColorParser.java index d4dbbf4c..2d8646ee 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/NamedTextColorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/NamedTextColorParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import java.util.ArrayList; import java.util.Locale; import net.kyori.adventure.text.format.NamedTextColor; @@ -34,6 +33,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/OperatorParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/OperatorParser.java index 19a6d6d5..dca603d3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/OperatorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/OperatorParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.lang.reflect.Method; import java.util.Optional; @@ -34,6 +33,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.command.parameter.managed.operator.Operator; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java index 751be192..358171a7 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.data.ProtoItemStack; -import cloud.commandframework.sponge.exception.ComponentMessageRuntimeException; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.lang.reflect.Field; import java.util.Arrays; @@ -43,6 +40,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.data.ProtoItemStack; +import org.incendo.cloud.sponge.exception.ComponentMessageRuntimeException; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/RegistryEntryParser.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/RegistryEntryParser.java index 95f45053..3eb80252 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/RegistryEntryParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/RegistryEntryParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCaptionKeys; import io.leangen.geantyref.TypeToken; import java.util.List; import java.util.Optional; @@ -40,6 +38,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCaptionKeys; import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.command.registrar.tree.CommandCompletionProviders; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyParser.java index 4cb32a76..7723d478 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyParser.java @@ -21,15 +21,15 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.context.CommandContext; import org.incendo.cloud.context.CommandInput; import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyUtil.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyUtil.java index 1c2e9ab0..bdff1a9e 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/ResourceKeyUtil.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ResourceKeyUtil.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.lang.reflect.Field; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java index 5d3258db..359d1993 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.SingleEntitySelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; @@ -38,6 +35,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; +import org.incendo.cloud.sponge.data.SingleEntitySelector; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java index c9e18602..ab9be032 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; -import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; @@ -38,6 +35,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; +import org.incendo.cloud.sponge.data.SinglePlayerSelector; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java index d11c1bbb..dd04b2f3 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java @@ -21,11 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCaptionKeys; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.ArrayList; import java.util.List; @@ -47,6 +44,9 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCaptionKeys; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.Sponge; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java index a0bc9ba6..7710c27b 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.Coordinates; @@ -36,6 +35,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java index 0cd422b1..368ea641 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.ColumnPosArgument; @@ -37,6 +35,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java similarity index 97% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java index 1bacd06c..79dee684 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.Coordinates; @@ -35,6 +34,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java index 3478306a..ac9faf98 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java @@ -21,10 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; -import cloud.commandframework.sponge.SpongeCommandContextKeys; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; @@ -36,6 +34,8 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; +import org.incendo.cloud.sponge.SpongeCommandContextKeys; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/VectorParser.java similarity index 95% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/VectorParser.java index 802a4c73..f66847e5 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/VectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/VectorParser.java @@ -21,10 +21,10 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.SuggestionProvider; /** diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/WorldParser.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/WorldParser.java index a7cc6212..f6fc17e6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/WorldParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/WorldParser.java @@ -21,9 +21,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; -import cloud.commandframework.sponge.NodeSource; import com.google.common.base.Suppliers; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import java.lang.reflect.Field; @@ -40,6 +39,7 @@ import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.sponge.NodeSource; import org.incendo.cloud.suggestion.BlockingSuggestionProvider; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/package-info.java similarity index 51% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/package-info.java index 637c61f3..e6629410 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/parser/package-info.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/package-info.java @@ -1,4 +1,4 @@ /** * Parsers for the Sponge 8 environment. */ -package cloud.commandframework.sponge.parser; +package org.incendo.cloud.sponge.parser; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestion.java similarity index 98% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestion.java index c47bf0f9..dccd57f6 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestion.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestion.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.suggestion; +package org.incendo.cloud.sponge.suggestion; import java.util.Optional; import net.kyori.adventure.text.Component; diff --git a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestionImpl.java similarity index 96% rename from cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java rename to cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestionImpl.java index a4b18be8..4689d2aa 100644 --- a/cloud-sponge/src/main/java/cloud/commandframework/sponge/suggestion/SpongeSuggestionImpl.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/SpongeSuggestionImpl.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.sponge.suggestion; +package org.incendo.cloud.sponge.suggestion; import net.kyori.adventure.text.Component; diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/package-info.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/package-info.java new file mode 100644 index 00000000..b29fcb74 --- /dev/null +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/suggestion/package-info.java @@ -0,0 +1,4 @@ +/** + * Sponge suggestion related classes. + */ +package org.incendo.cloud.sponge.suggestion; diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java similarity index 92% rename from examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java rename to examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java index bb2f2dbf..0b3c555c 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java @@ -23,14 +23,6 @@ // package cloud.commandframework.examples.sponge; -import cloud.commandframework.sponge.CloudInjectionModule; -import cloud.commandframework.sponge.SpongeCommandManager; -import cloud.commandframework.sponge.data.BlockInput; -import cloud.commandframework.sponge.data.BlockPredicate; -import cloud.commandframework.sponge.data.ItemStackPredicate; -import cloud.commandframework.sponge.data.MultipleEntitySelector; -import cloud.commandframework.sponge.data.ProtoItemStack; -import cloud.commandframework.sponge.data.SinglePlayerSelector; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; @@ -50,6 +42,14 @@ import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler; import org.incendo.cloud.parser.standard.StringParser; import org.incendo.cloud.permission.PredicatePermission; +import org.incendo.cloud.sponge.CloudInjectionModule; +import org.incendo.cloud.sponge.SpongeCommandManager; +import org.incendo.cloud.sponge.data.BlockInput; +import org.incendo.cloud.sponge.data.BlockPredicate; +import org.incendo.cloud.sponge.data.ItemStackPredicate; +import org.incendo.cloud.sponge.data.MultipleEntitySelector; +import org.incendo.cloud.sponge.data.ProtoItemStack; +import org.incendo.cloud.sponge.data.SinglePlayerSelector; import org.incendo.cloud.type.tuple.Pair; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; @@ -84,20 +84,6 @@ import org.spongepowered.math.vector.Vector3i; import org.spongepowered.plugin.builtin.jvm.Plugin; -import static cloud.commandframework.sponge.parser.BlockInputParser.blockInputParser; -import static cloud.commandframework.sponge.parser.BlockPredicateParser.blockPredicateParser; -import static cloud.commandframework.sponge.parser.DataContainerParser.dataContainerParser; -import static cloud.commandframework.sponge.parser.ItemStackPredicateParser.itemStackPredicateParser; -import static cloud.commandframework.sponge.parser.MultipleEntitySelectorParser.multipleEntitySelectorParser; -import static cloud.commandframework.sponge.parser.NamedTextColorParser.namedTextColorParser; -import static cloud.commandframework.sponge.parser.OperatorParser.operatorParser; -import static cloud.commandframework.sponge.parser.ProtoItemStackParser.protoItemStackParser; -import static cloud.commandframework.sponge.parser.RegistryEntryParser.registryEntryParser; -import static cloud.commandframework.sponge.parser.SinglePlayerSelectorParser.singlePlayerSelectorParser; -import static cloud.commandframework.sponge.parser.UserParser.userParser; -import static cloud.commandframework.sponge.parser.Vector3dParser.vector3dParser; -import static cloud.commandframework.sponge.parser.Vector3iParser.vector3iParser; -import static cloud.commandframework.sponge.parser.WorldParser.worldParser; import static net.kyori.adventure.text.Component.newline; import static net.kyori.adventure.text.Component.space; import static net.kyori.adventure.text.Component.text; @@ -112,6 +98,20 @@ import static org.incendo.cloud.parser.standard.IntegerParser.integerParser; import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser; import static org.incendo.cloud.parser.standard.StringParser.stringParser; +import static org.incendo.cloud.sponge.parser.BlockInputParser.blockInputParser; +import static org.incendo.cloud.sponge.parser.BlockPredicateParser.blockPredicateParser; +import static org.incendo.cloud.sponge.parser.DataContainerParser.dataContainerParser; +import static org.incendo.cloud.sponge.parser.ItemStackPredicateParser.itemStackPredicateParser; +import static org.incendo.cloud.sponge.parser.MultipleEntitySelectorParser.multipleEntitySelectorParser; +import static org.incendo.cloud.sponge.parser.NamedTextColorParser.namedTextColorParser; +import static org.incendo.cloud.sponge.parser.OperatorParser.operatorParser; +import static org.incendo.cloud.sponge.parser.ProtoItemStackParser.protoItemStackParser; +import static org.incendo.cloud.sponge.parser.RegistryEntryParser.registryEntryParser; +import static org.incendo.cloud.sponge.parser.SinglePlayerSelectorParser.singlePlayerSelectorParser; +import static org.incendo.cloud.sponge.parser.UserParser.userParser; +import static org.incendo.cloud.sponge.parser.Vector3dParser.vector3dParser; +import static org.incendo.cloud.sponge.parser.Vector3iParser.vector3iParser; +import static org.incendo.cloud.sponge.parser.WorldParser.worldParser; @Plugin("cloud-example-sponge") public final class CloudExamplePlugin { diff --git a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/package-info.java similarity index 96% rename from examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java rename to examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/package-info.java index f8e78d06..e93c92bb 100644 --- a/examples/example-sponge/src/main/java/cloud/commandframework/examples/sponge/package-info.java +++ b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/package-info.java @@ -24,4 +24,4 @@ /** * Cloud example for Sponge API v8 */ -package cloud.commandframework.examples.sponge; +package org.incendo.cloud.examples.sponge; From b654ee97f0ff00ddf9382df21bbcc90c29080601 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 21 Feb 2024 09:46:43 -0700 Subject: [PATCH 66/72] Update for cloud beta 3 --- .../java/org/incendo/cloud/sponge/parser/BlockInputParser.java | 2 +- .../org/incendo/cloud/sponge/parser/BlockPredicateParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/ComponentParser.java | 2 +- .../org/incendo/cloud/sponge/parser/DataContainerParser.java | 2 +- .../cloud/sponge/parser/GameProfileCollectionParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/GameProfileParser.java | 2 +- .../incendo/cloud/sponge/parser/ItemStackPredicateParser.java | 2 +- .../cloud/sponge/parser/MultipleEntitySelectorParser.java | 2 +- .../cloud/sponge/parser/MultiplePlayerSelectorParser.java | 2 +- .../org/incendo/cloud/sponge/parser/ProtoItemStackParser.java | 2 +- .../incendo/cloud/sponge/parser/SingleEntitySelectorParser.java | 2 +- .../incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/Vector2dParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/Vector2iParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/Vector3dParser.java | 2 +- .../java/org/incendo/cloud/sponge/parser/Vector3iParser.java | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java index fb4f2c51..52e7ff6d 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockInputParser.java @@ -93,7 +93,7 @@ public static ParserDescriptor blockInputParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java index 75632fcd..fd840818 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/BlockPredicateParser.java @@ -77,7 +77,7 @@ public static ParserDescriptor blockPredicateParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java index 041c59b5..c1b6ddf8 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java @@ -71,7 +71,7 @@ public static ParserDescriptor componentParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java index 6364fb93..8b29fa1b 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/DataContainerParser.java @@ -74,7 +74,7 @@ public static ParserDescriptor dataContainerParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java index 6096e698..44e4d646 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileCollectionParser.java @@ -97,7 +97,7 @@ public static ParserDescriptor gameProfileCollecti } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java index 46b9696a..becfea35 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/GameProfileParser.java @@ -91,7 +91,7 @@ public static ParserDescriptor gameProfileParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java index 1b748ba3..2b6df2d1 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ItemStackPredicateParser.java @@ -74,7 +74,7 @@ public static ParserDescriptor itemStackPredicatePars } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java index 54fa1f7d..2d4cf653 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultipleEntitySelectorParser.java @@ -94,7 +94,7 @@ public static ParserDescriptor multipleEntitySele } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java index d52fc7e6..2105705f 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/MultiplePlayerSelectorParser.java @@ -94,7 +94,7 @@ public static ParserDescriptor multiplePlayerSele } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java index 358171a7..d69b572b 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ProtoItemStackParser.java @@ -92,7 +92,7 @@ public static ParserDescriptor protoItemStackParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java index 359d1993..4ed76d7a 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SingleEntitySelectorParser.java @@ -90,7 +90,7 @@ public static ParserDescriptor singleEntitySelector } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java index ab9be032..8ca517b1 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/SinglePlayerSelectorParser.java @@ -92,7 +92,7 @@ public static ParserDescriptor singlePlayerSelector } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java index 7710c27b..95619dbc 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2dParser.java @@ -103,7 +103,7 @@ public Vector2dParser(final boolean centerIntegers) { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java index 368ea641..89224a12 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector2iParser.java @@ -87,7 +87,7 @@ public static ParserDescriptor vector2iParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java index 79dee684..0c7eff74 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3dParser.java @@ -103,7 +103,7 @@ public Vector3dParser(final boolean centerIntegers) { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java index ac9faf98..3bd5e6c2 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/Vector3iParser.java @@ -85,7 +85,7 @@ public static ParserDescriptor vector3iParser() { } @Override - public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestionsFuture( + public @NonNull CompletableFuture> suggestionsFuture( final @NonNull CommandContext context, final @NonNull CommandInput input ) { From 018134826c25fe10c8c0da9792d36381cae84739 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 11 Mar 2024 18:45:55 -0700 Subject: [PATCH 67/72] fix compile --- .../main/java/org/incendo/cloud/sponge/parser/UserParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java index dd04b2f3..6e480840 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/UserParser.java @@ -158,7 +158,7 @@ public static ParserDescriptor userParser() { .map(profile -> profile.name().orElse(null)) .filter(Objects::nonNull) .filter(name -> suggestions.stream().noneMatch(s -> s.suggestion().equals(name))) - .map(Suggestion::simple) + .map(Suggestion::suggestion) .collect(Collectors.toList())); } return suggestions; From e2d8b66ba73c851a5389beb6953548e014db8c9f Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:39:25 -0700 Subject: [PATCH 68/72] fix compound example compile --- .../examples/sponge/CloudExamplePlugin.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java index 0b3c555c..65ad974f 100644 --- a/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java +++ b/examples/example-sponge/src/main/java/org/incendo/cloud/examples/sponge/CloudExamplePlugin.java @@ -21,7 +21,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // -package cloud.commandframework.examples.sponge; +package org.incendo.cloud.examples.sponge; import com.google.inject.Inject; import com.google.inject.Injector; @@ -40,6 +40,7 @@ import org.incendo.cloud.description.Description; import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler; +import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.standard.StringParser; import org.incendo.cloud.permission.PredicatePermission; import org.incendo.cloud.sponge.CloudInjectionModule; @@ -50,7 +51,7 @@ import org.incendo.cloud.sponge.data.MultipleEntitySelector; import org.incendo.cloud.sponge.data.ProtoItemStack; import org.incendo.cloud.sponge.data.SinglePlayerSelector; -import org.incendo.cloud.type.tuple.Pair; +import org.incendo.cloud.sponge.exception.ComponentMessageRuntimeException; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandCause; @@ -403,12 +404,16 @@ private void registerCommands() { .requiredArgumentPair( "itemstack", TypeToken.get(ItemStack.class), - Pair.of("item", "amount"), - Pair.of(ProtoItemStack.class, Integer.class), - (sender, pair) -> { - final ProtoItemStack proto = pair.first(); - final int amount = pair.second(); - return proto.createItemStack(amount, true); + "item", protoItemStackParser(), + "amount", integerParser(), + (sender, proto, amount) -> { + try { + return ArgumentParseResult.successFuture( + proto.createItemStack(amount, true) + ); + } catch (final ComponentMessageRuntimeException e) { + return ArgumentParseResult.failureFuture(e); + } }, Description.of("The ItemStack to give") ) From ecfa09f1f9e10628f268bd27fa28e95f261e6658 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:15:57 -0700 Subject: [PATCH 69/72] Fix sponge compile --- cloud-sponge/build.gradle.kts | 4 ++-- examples/example-sponge/build.gradle.kts | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index ec92a4d7..492dcfc9 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -11,10 +11,10 @@ dependencies { implementation(libs.cloud.brigadier) implementation(project(":cloud-minecraft-modded-common", configuration = "namedElements")) compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT") - compileOnly("org.spongepowered:sponge:1.20.2-11.0.0-SNAPSHOT") + compileOnly("org.spongepowered:sponge:1.20.4-11.0.0-SNAPSHOT") } minecraft { - version("1.20.2") + version("1.20.4") platform(MinecraftPlatform.JOINED) } diff --git a/examples/example-sponge/build.gradle.kts b/examples/example-sponge/build.gradle.kts index 409e6a0d..e6419965 100644 --- a/examples/example-sponge/build.gradle.kts +++ b/examples/example-sponge/build.gradle.kts @@ -49,3 +49,10 @@ configurations { } } } + +afterEvaluate { + tasks.compileJava { + // TODO - sponge AP not compatible with J21 + options.compilerArgs.remove("-Werror") + } +} From 7dd03f125773dff03bd03761651d544bda698008 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Fri, 3 May 2024 11:45:14 -0700 Subject: [PATCH 70/72] Update sponge for access check changes --- .../cloud/sponge/CloudSpongeCommand.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java index bd863e6b..05119094 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java @@ -23,11 +23,13 @@ // package org.incendo.cloud.sponge; +import io.leangen.geantyref.GenericTypeReflector; +import java.lang.reflect.Type; import java.util.ArrayDeque; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.NonNull; @@ -83,10 +85,11 @@ public List complete( @Override public boolean canExecute(final @NonNull CommandCause cause) { - return this.commandManager.testPermission( - this.commandManager.senderMapper().map(cause), - (Permission) this.namedNode().nodeMeta().getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()) - ).allowed(); + return this.checkAccess( + cause, + this.namedNode().nodeMeta() + .getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap()) + ); } @Override @@ -188,23 +191,25 @@ private static boolean canExecute(final @NonNull CommandNode node) { || node.children().stream().noneMatch(c -> c.component().required()); } - @SuppressWarnings("unchecked") private void addRequirement( final @NonNull CommandNode cloud, final @NonNull CommandTreeNode> node ) { - final Permission permission = (Permission) cloud.nodeMeta() - .getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()); - final Set> senderTypes = (Set>) cloud.nodeMeta().get(CommandNode.META_KEY_SENDER_TYPES); - node.requires(cause -> { - final C c = this.commandManager.senderMapper().map(cause); - for (final Class senderType : senderTypes) { - if (senderType.isInstance(c)) { - return this.commandManager.testPermission(c, permission).allowed(); + final Map accessMap = + cloud.nodeMeta().getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap()); + node.requires(cause -> this.checkAccess(cause, accessMap)); + } + + private boolean checkAccess(final CommandCause cause, final Map accessMap) { + final C cloudSender = this.commandManager.senderMapper().map(cause); + for (final Map.Entry entry : accessMap.entrySet()) { + if (GenericTypeReflector.isSuperType(entry.getKey(), cloudSender.getClass())) { + if (this.commandManager.testPermission(cloudSender, entry.getValue()).allowed()) { + return true; } } - return false; - }); + } + return false; } private String formatCommandForParsing(final @NonNull String arguments) { From c64fcf6bf7575480c2078f7abe79cc9a1b6ac3b7 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 30 May 2024 15:04:00 -0700 Subject: [PATCH 71/72] 1.20.6 --- cloud-sponge/build.gradle.kts | 4 ++-- .../org/incendo/cloud/sponge/SpongeRegistrationHandler.java | 2 +- .../java/org/incendo/cloud/sponge/parser/ComponentParser.java | 4 +++- gradle/libs.versions.toml | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cloud-sponge/build.gradle.kts b/cloud-sponge/build.gradle.kts index 492dcfc9..43459226 100644 --- a/cloud-sponge/build.gradle.kts +++ b/cloud-sponge/build.gradle.kts @@ -11,10 +11,10 @@ dependencies { implementation(libs.cloud.brigadier) implementation(project(":cloud-minecraft-modded-common", configuration = "namedElements")) compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT") - compileOnly("org.spongepowered:sponge:1.20.4-11.0.0-SNAPSHOT") + compileOnly("org.spongepowered:sponge:1.20.6-11.0.0-SNAPSHOT") } minecraft { - version("1.20.4") + version("1.20.6") platform(MinecraftPlatform.JOINED) } diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java index 9f4edd29..e742d5d9 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java @@ -77,7 +77,7 @@ private void startedEngine(final StartedEngineEvent serverStartedEngineE final MinecraftServer engine = (MinecraftServer) serverStartedEngineEvent.engine(); ContextualArgumentTypeProvider.withBuildContext( this.commandManager, - CommandBuildContext.configurable(engine.registryAccess(), engine.getWorldData().enabledFeatures()), + CommandBuildContext.simple(engine.registryAccess(), engine.getWorldData().enabledFeatures()), true, () -> { for (final org.incendo.cloud.Command registeredCommand : this.registeredCommands) { diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java index c1b6ddf8..4ccdde92 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/parser/ComponentParser.java @@ -25,10 +25,12 @@ import java.util.concurrent.CompletableFuture; import net.kyori.adventure.text.Component; +import net.minecraft.commands.arguments.ComponentArgument; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.brigadier.parser.WrappedBrigadierParser; import org.incendo.cloud.context.CommandContext; import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.minecraft.modded.internal.ContextualArgumentTypeProvider; import org.incendo.cloud.parser.ArgumentParseResult; import org.incendo.cloud.parser.ArgumentParser; import org.incendo.cloud.parser.ParserDescriptor; @@ -58,7 +60,7 @@ public static ParserDescriptor componentParser() { private final ArgumentParser mappedParser = new WrappedBrigadierParser( - net.minecraft.commands.arguments.ComponentArgument.textComponent() + new ContextualArgumentTypeProvider<>(ComponentArgument::textComponent) ).flatMapSuccess((ctx, component) -> ArgumentParseResult.successFuture(SpongeAdventure.asAdventure(component))); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c3bcaeba..3319f858 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ neoForge = "net.neoforged:neoforge:20.6.121" cloud-buildLogic-spotless = { id = "org.incendo.cloud-build-logic.spotless", version.ref = "cloud-build-logic" } cloud-buildLogic-rootProject-publishing = { id = "org.incendo.cloud-build-logic.publishing.root-project", version.ref = "cloud-build-logic" } cloud-buildLogic-rootProject-spotless = { id = "org.incendo.cloud-build-logic.spotless.root-project", version.ref = "cloud-build-logic" } -shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } +shadow = { id = "io.github.goooler.shadow", version = "8.1.7" } [bundles] immutables = ["immutables", "immutablesAnnotate"] From d19fd342b1b959d7bc9175341c65152b863d156b Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:38:52 -0700 Subject: [PATCH 72/72] fix stack overflow in sponge registration --- .../org/incendo/cloud/sponge/SpongeRegistrationHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java index e742d5d9..acb25898 100644 --- a/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java +++ b/cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java @@ -133,7 +133,7 @@ private static void unwrap( final ArgumentParser parser ) { if (parser instanceof MappedArgumentParser mapped) { - unwrap(parsers, mapped); + unwrap(parsers, mapped.baseParser()); return; } if (parser instanceof EitherParser eitherParser) {