From c4055358b113d390b3bc291ff1427f0ff14f30f8 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Thu, 15 Aug 2024 15:30:22 +0200 Subject: [PATCH] Add brigadier ArgumentTypes --- .../argumement/EnchantmentArgument.java | 53 +++++++++++++++++ .../commands/argumement/GameModeArgument.java | 48 +++++++++++++++ .../commands/argumement/HomeArgument.java | 58 +++++++++++++++++++ .../argumement/OfflinePlayerArgument.java | 34 +++++++++++ .../OfflinePlayerCompletingArgument.java | 50 ++++++++++++++++ 5 files changed, 243 insertions(+) create mode 100644 plugin/src/main/java/com/alttd/essentia/commands/argumement/EnchantmentArgument.java create mode 100644 plugin/src/main/java/com/alttd/essentia/commands/argumement/GameModeArgument.java create mode 100644 plugin/src/main/java/com/alttd/essentia/commands/argumement/HomeArgument.java create mode 100644 plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerArgument.java create mode 100644 plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerCompletingArgument.java diff --git a/plugin/src/main/java/com/alttd/essentia/commands/argumement/EnchantmentArgument.java b/plugin/src/main/java/com/alttd/essentia/commands/argumement/EnchantmentArgument.java new file mode 100644 index 0000000..92fb334 --- /dev/null +++ b/plugin/src/main/java/com/alttd/essentia/commands/argumement/EnchantmentArgument.java @@ -0,0 +1,53 @@ +package com.alttd.essentia.commands.argumement; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.GameMode; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.enchantments.Enchantment; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public class EnchantmentArgument implements CustomArgumentType.Converted { + + @Override + public @NotNull Enchantment convert(String nativeType) throws CommandSyntaxException { + try { + return Enchantment.getByKey(NamespacedKey.minecraft(nativeType)); + } catch (Exception e) { + Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid gamemode %s!".formatted(nativeType), NamedTextColor.RED)); + + throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message); + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + for (Enchantment enchantment : RegistryAccess.registryAccess().getRegistry(RegistryKey.ENCHANTMENT)) { + builder.suggest(enchantment.getKey().value()); + } + + return CompletableFuture.completedFuture( + builder.build() + ); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/alttd/essentia/commands/argumement/GameModeArgument.java b/plugin/src/main/java/com/alttd/essentia/commands/argumement/GameModeArgument.java new file mode 100644 index 0000000..3fc603e --- /dev/null +++ b/plugin/src/main/java/com/alttd/essentia/commands/argumement/GameModeArgument.java @@ -0,0 +1,48 @@ +package com.alttd.essentia.commands.argumement; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.GameMode; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public class GameModeArgument implements CustomArgumentType.Converted { + + @Override + public @NotNull GameMode convert(String nativeType) throws CommandSyntaxException { + try { + return GameMode.valueOf(nativeType.toUpperCase()); + } catch (Exception e) { + Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid gamemode %s!".formatted(nativeType), NamedTextColor.RED)); + + throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message); + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + for (GameMode gameMode : GameMode.values()) { + builder.suggest(gameMode.name().toLowerCase()); + } + + return CompletableFuture.completedFuture( + builder.build() + ); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/alttd/essentia/commands/argumement/HomeArgument.java b/plugin/src/main/java/com/alttd/essentia/commands/argumement/HomeArgument.java new file mode 100644 index 0000000..98cb488 --- /dev/null +++ b/plugin/src/main/java/com/alttd/essentia/commands/argumement/HomeArgument.java @@ -0,0 +1,58 @@ +package com.alttd.essentia.commands.argumement; + +import com.alttd.essentia.EssentiaPlugin; +import com.alttd.essentia.api.model.Home; +import com.alttd.essentia.api.user.User; +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public class HomeArgument implements CustomArgumentType.Converted { + + User user; + public HomeArgument(OfflinePlayer offlinePlayer) { + user = EssentiaPlugin.instance().userManager().getUser(offlinePlayer.getUniqueId()); + if (user == null) + user = EssentiaPlugin.instance().storageProvider().loadUser(offlinePlayer.getUniqueId()); + } + + @Override + public @NotNull Home convert(String nativeType) throws CommandSyntaxException { + try { + return user.getHome(nativeType); + } catch (Exception e) { + Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid Home %s!".formatted(nativeType), NamedTextColor.RED)); + + throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message); + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + for (String home : user.getHomes()) { + builder.suggest(home); + } + + return CompletableFuture.completedFuture( + builder.build() + ); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerArgument.java b/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerArgument.java new file mode 100644 index 0000000..88e12b8 --- /dev/null +++ b/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerArgument.java @@ -0,0 +1,34 @@ +package com.alttd.essentia.commands.argumement; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +public class OfflinePlayerArgument implements CustomArgumentType.Converted { + + @Override + public @NotNull OfflinePlayer convert(String nativeType) throws CommandSyntaxException { + try { + return Bukkit.getOfflinePlayer(nativeType); + } catch (Exception e) { + Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid PlayerName %s!".formatted(nativeType), NamedTextColor.RED)); + + throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message); + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + +} \ No newline at end of file diff --git a/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerCompletingArgument.java b/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerCompletingArgument.java new file mode 100644 index 0000000..da8efcd --- /dev/null +++ b/plugin/src/main/java/com/alttd/essentia/commands/argumement/OfflinePlayerCompletingArgument.java @@ -0,0 +1,50 @@ +package com.alttd.essentia.commands.argumement; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public class OfflinePlayerCompletingArgument implements CustomArgumentType.Converted { + + @Override + public @NotNull OfflinePlayer convert(String nativeType) throws CommandSyntaxException { + try { + return Bukkit.getOfflinePlayer(nativeType); + } catch (Exception e) { + Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid PlayerName %s!".formatted(nativeType), NamedTextColor.RED)); + + throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message); + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + for (Player player : Bukkit.getOnlinePlayers()) { + builder.suggest(player.getName(), MessageComponentSerializer.message().serialize(player.displayName())); + } + + return CompletableFuture.completedFuture( + builder.build() + ); + } +} \ No newline at end of file