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 { private static final Collection 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 CompletableFuture listSuggestions(CommandContext 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 getExamples() { return EXAMPLES; } }