🎨 Make MinecraftHelp use Component builders instead of MiniMessage, add a configurable Color pallet

This commit is contained in:
jmp 2020-10-08 16:16:10 -07:00 • committed by Alexander Söderberg
parent fdb80b304c
commit 29740aa780
2 changed files with 319 additions and 124 deletions

View file

@ -36,6 +36,8 @@ import cloud.commandframework.annotations.Confirmation;
import cloud.commandframework.annotations.Flag;
import cloud.commandframework.annotations.specifier.Greedy;
import cloud.commandframework.arguments.CommandArgument;
import cloud.commandframework.arguments.parser.ArgumentParseResult;
import cloud.commandframework.arguments.parser.ArgumentParser;
import cloud.commandframework.arguments.parser.ParserParameters;
import cloud.commandframework.arguments.parser.StandardParameters;
import cloud.commandframework.arguments.standard.EnumArgument;
@ -46,16 +48,19 @@ import cloud.commandframework.bukkit.CloudBukkitCapabilities;
import cloud.commandframework.bukkit.arguments.selector.SingleEntitySelector;
import cloud.commandframework.bukkit.parsers.WorldArgument;
import cloud.commandframework.bukkit.parsers.selector.SingleEntitySelectorArgument;
import cloud.commandframework.context.CommandContext;
import cloud.commandframework.execution.AsynchronousCommandExecutionCoordinator;
import cloud.commandframework.execution.CommandExecutionCoordinator;
import cloud.commandframework.extra.confirmation.CommandConfirmationManager;
import cloud.commandframework.meta.CommandMeta;
import cloud.commandframework.paper.PaperCommandManager;
import cloud.commandframework.types.tuples.Triplet;
import com.google.common.collect.ImmutableList;
import io.leangen.geantyref.TypeToken;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@ -70,7 +75,9 @@ import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
@ -267,6 +274,78 @@ public final class ExamplePlugin extends JavaPlugin {
((Player) c.getSender()).getInventory().addItem(itemStack);
c.getSender().sendMessage("You've been given stuff, bro.");
}));
//
// An Argument Parser for TextColor that accepts NamedTextColor names or RGB colors in the format 'RRGGBB'
//
final ArgumentParser<CommandSender, TextColor> textColorArgumentParser = (context, inputQueue) -> {
final String input = inputQueue.peek();
if (input == null) {
return ArgumentParseResult.failure(new IllegalArgumentException("No input provided"));
}
if (NamedTextColor.NAMES.keys().contains(input.toLowerCase())) {
inputQueue.remove();
return ArgumentParseResult.success(NamedTextColor.NAMES.value(input.toLowerCase()));
}
final TextColor hex = TextColor.fromHexString("#" + input);
if (hex != null) {
inputQueue.remove();
return ArgumentParseResult.success(hex);
}
return ArgumentParseResult.failure(new IllegalArgumentException(
"No such color. Try a NamedTextColor or Hex in the format 'RRGGBB'"));
};
//
// A Suggestions Provider which returns the list of NamedTextColors
//
final BiFunction<CommandContext<CommandSender>, String, List<String>> textColorSuggestionsProvider =
(context, input) -> ImmutableList.copyOf(NamedTextColor.NAMES.keys());
//
// A command to change the color scheme for the help command
//
manager.command(
manager.commandBuilder("example")
.literal("helpcolors")
.argument(
manager.argumentBuilder(TextColor.class, "primary")
.withParser(textColorArgumentParser)
.withSuggestionsProvider(textColorSuggestionsProvider),
Description.of("The primary color for the color scheme")
)
.argument(
manager.argumentBuilder(TextColor.class, "highlight")
.withParser(textColorArgumentParser)
.withSuggestionsProvider(textColorSuggestionsProvider),
Description.of("he primary color used to highlight commands and queries")
)
.argument(
manager.argumentBuilder(TextColor.class, "alternate_highlight")
.withParser(textColorArgumentParser)
.withSuggestionsProvider(textColorSuggestionsProvider),
Description.of("The secondary color used to highlight commands and queries")
)
.argument(
manager.argumentBuilder(TextColor.class, "text")
.withParser(textColorArgumentParser)
.withSuggestionsProvider(textColorSuggestionsProvider),
Description.of("The color used for description text")
)
.argument(
manager.argumentBuilder(TextColor.class, "accent")
.withParser(textColorArgumentParser)
.withSuggestionsProvider(textColorSuggestionsProvider),
Description.of("The color used for accents and symbols")
)
.handler(c -> minecraftHelp.setHelpColors(MinecraftHelp.HelpColors.of(
c.get("primary"),
c.get("highlight"),
c.get("alternate_highlight"),
c.get("text"),
c.get("accent")
)))
);
}
@CommandMethod("example help [query]")