aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java')
-rw-r--r--src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java b/src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java
new file mode 100644
index 0000000..e56ade3
--- /dev/null
+++ b/src/main/java/org/chrisoft/trashyaddon/commands/argument/ColorCodeArgumentType.java
@@ -0,0 +1,79 @@
+package org.chrisoft.trashyaddon.commands.argument;
+
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.arguments.ArgumentType;
+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 meteordevelopment.meteorclient.utils.render.color.Color;
+import net.minecraft.command.CommandSource;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.CompletableFuture;
+
+public class ColorCodeArgumentType implements ArgumentType<Color> {
+ private static final Collection<String> EXAMPLES = Arrays.asList("#000", "#FFFFFF", "#AA667788", "red");
+ private static final SimpleCommandExceptionType BAD_COLOR_CODE = new SimpleCommandExceptionType(Text.literal("Invalid color code."));
+ private ColorCodeArgumentType() {}
+ public static ColorCodeArgumentType colorCode() { return new ColorCodeArgumentType(); }
+
+ @Override
+ public Color parse(StringReader reader) throws CommandSyntaxException {
+ if (reader.peek() == '#') {
+ reader.read();
+ String v = reader.readString();
+ switch (v.length()) {
+ case 3:
+ try {
+ int iv = Integer.parseInt(v, 16);
+ int r = iv & 0xF00 >> 8;
+ int g = iv & 0xF0 >> 4;
+ int b = iv & 0xF;
+ return new Color((r << 4) | r, (g << 4) | g, (b << 4) | b);
+ } catch (NumberFormatException __) {
+ throw BAD_COLOR_CODE.create();
+ }
+ case 6:
+ try {
+ int iv = Integer.parseInt(v, 16);
+ int p = 0xFF000000 | iv;
+ return new Color(p);
+ } catch (NumberFormatException __) {
+ throw BAD_COLOR_CODE.create();
+ }
+ case 8:
+ try {
+ int iv = Integer.parseUnsignedInt(v, 16);
+ return new Color(iv);
+ } catch (NumberFormatException __) {
+ throw BAD_COLOR_CODE.create();
+ }
+ default: throw BAD_COLOR_CODE.create();
+ }
+ }
+ String str = reader.readUnquotedString();
+ Formatting lv = Formatting.byName(str);
+ if (lv != null && lv.isColor()) {
+ return new Color(lv.getColorValue()).a(255);
+ }
+ throw BAD_COLOR_CODE.create();
+ }
+
+ @Override
+ public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
+ StringReader stringReader = new StringReader(builder.getRemaining());
+ if (stringReader.canRead(1) && stringReader.peek() == '#')
+ return builder.buildFuture();
+ return CommandSource.suggestMatching(Formatting.getNames(true, false).stream().filter(x -> !x.equals("reset")), builder);
+ }
+
+ @Override
+ public Collection<String> getExamples() {
+ return EXAMPLES;
+ }
+}