@@ -0,0 +1,3268 @@
+package com.ptsmods.morecommands.api.clientoptions;%0A%0Aimport com.ptsmods.morecommands.api.util.extensions.ObjectExtensions;%0Aimport com.ptsmods.morecommands.api.util.text.LiteralTextBuilder;%0Aimport lombok.experimental.ExtensionMethod;%0Aimport net.minecraft.client.MinecraftClient;%0Aimport net.minecraft.client.gui.widget.TextFieldWidget;%0Aimport net.minecraft.text.Text;%0A%0Aimport java.util.function.BiConsumer;%0Aimport java.util.function.Predicate;%0A%0A@ExtensionMethod(ObjectExtensions.class)%0Apublic class StringClientOption extends ClientOption%3CString%3E %7B%0A    private final Predicate%3CString%3E predicate;%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue) %7B%0A        this(category, name, defaultValue, s -%3E true);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, BiConsumer%3CString, String%3E updateConsumer) %7B%0A        this(category, name, defaultValue, updateConsumer, s -%3E true);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, String... comments) %7B%0A        this(category, name, defaultValue, s -%3E true, comments);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, BiConsumer%3CString, String%3E updateConsumer, String... comments) %7B%0A        this(category, name, defaultValue, updateConsumer, s -%3E true, comments);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, Predicate%3CString%3E predicate) %7B%0A        super(category, name, defaultValue);%0A        this.predicate = predicate.or(s -%3E true);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, BiConsumer%3CString, String%3E updateConsumer, Predicate%3CString%3E predicate) %7B%0A        super(category, name, defaultValue, updateConsumer);%0A        this.predicate = predicate.or(s -%3E true);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, Predicate%3CString%3E predicate, String... comments) %7B%0A        super(category, name, defaultValue, comments);%0A        this.predicate = predicate.or(s -%3E true);%0A    %7D%0A%0A    public StringClientOption(ClientOptionCategory category, String name, String defaultValue, BiConsumer%3CString, String%3E updateConsumer, Predicate%3CString%3E predicate, String... comments) %7B%0A        super(category, name, defaultValue, updateConsumer, comments);%0A        this.predicate = predicate.or(s -%3E true);%0A    %7D%0A%0A    @Override%0A    public String getValueString() %7B%0A        return getValueRaw();%0A    %7D%0A%0A    @Override%0A    public void setValueString(String s) %7B%0A        setValue(s);%0A    %7D%0A%0A    @Override%0A    public Object createButton(int x, int y, String name, Runnable init, Runnable save) %7B%0A        TextFieldWidget widget = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, x, y, 150, 20, LiteralTextBuilder.literal(getName()));%0A        widget.setText(getValueRaw());%0A        widget.setChangedListener(s -%3E %7B%0A            if (!predicate.test(s)) return;%0A%0A            setValue(s);%0A            save.run();%0A        %7D);%0A        return widget;%0A    %7D%0A%0A    @Override%0A    public Text createButtonText(String name) %7B%0A        return LiteralTextBuilder.literal(getName());%0A    %7D%0A%7D%0A

Add StringClientOption