diff --git a/src/main/java/carpet/commands/ParcetCommand.java b/src/main/java/carpet/commands/ParcetCommand.java index a614c7bb..083c1766 100644 --- a/src/main/java/carpet/commands/ParcetCommand.java +++ b/src/main/java/carpet/commands/ParcetCommand.java @@ -3,7 +3,6 @@ package carpet.commands; import carpet.CarpetServer; import carpet.CarpetSettings; import carpet.settings.ParsedRule; -import carpet.settings.RuleCategory; import carpet.settings.SettingsManager; import carpet.utils.Messenger; import com.mojang.brigadier.CommandDispatcher; @@ -11,16 +10,12 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.command.CommandManager; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.text.BaseText; -import net.minecraft.text.Text; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; @@ -43,7 +38,7 @@ public class ParcetCommand "Current CarpetMod Startup Settings from carpet.conf", CarpetServer.settingsManager.findStartupOverrides()))). then(argument("tag",StringArgumentType.word()). - suggests( (c, b)->suggestMatching(Arrays.stream(RuleCategory.values()).map(r -> r.lowerCase), b)). + suggests( (c, b)->suggestMatching(SettingsManager.getCategories(), b)). executes( (c) -> listSettings(c.getSource(), String.format("CarpetMod Settings matching \"%s\"", StringArgumentType.getString(c, "tag")), CarpetServer.settingsManager.getRulesMatching(StringArgumentType.getString(c, "tag")))))); @@ -94,7 +89,7 @@ public class ParcetCommand List tags = new ArrayList<>(); tags.add(Messenger.c("w Tags: ")); - for (String t: Arrays.stream(RuleCategory.values()).sorted().map(c -> c.lowerCase).collect(Collectors.toList())) + for (String t: SettingsManager.getCategories()) { tags.add(Messenger.c("c ["+t+"]", "^g list all "+t+" settings","!/carpet list "+t)); tags.add(Messenger.c("w , ")); @@ -191,7 +186,7 @@ public class ParcetCommand PlayerEntity player = source.getPlayer(); List tags = new ArrayList<>(); tags.add("w Browse Categories:\n"); - for (String t : Arrays.stream(RuleCategory.values()).map(r -> r.lowerCase).collect(Collectors.toList())) + for (String t : SettingsManager.getCategories()) { tags.add("c [" + t+"]"); tags.add("^g list all " + t + " settings"); diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index 224b2895..674dd137 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -1,5 +1,6 @@ package carpet.settings; +import carpet.CarpetServer; import carpet.utils.Messenger; import com.google.common.collect.ImmutableList; import net.minecraft.server.command.ServerCommandSource; @@ -12,13 +13,11 @@ import java.util.List; import java.util.Locale; public final class ParsedRule implements Comparable { - public final Rule rule; public final Field field; - public final String name; public final String description; public final ImmutableList extraInfo; - public final ImmutableList categories; + public final ImmutableList categories; public final ImmutableList options; public boolean isStrict; public final Class type; @@ -37,7 +36,6 @@ public final class ParsedRule implements Comparable { } ParsedRule(Field field, Rule rule) { - this.rule = rule; this.field = field; this.name = rule.name().isEmpty() ? field.getName() : rule.name(); this.type = (Class) field.getType(); @@ -52,16 +50,20 @@ public final class ParsedRule implements Comparable { } if (categories.contains(RuleCategory.COMMANDS)) this.validators.add(callConstructor(Validator._COMMAND.class)); - this.defaultValue = get(); this.defaultAsString = convertToString(this.defaultValue); - if (this.type == boolean.class) { + if (this.type == boolean.class) + { this.isStrict = true; // it has no sense otherwise this.options = ImmutableList.of("true", "false"); - } else if (this.type.isEnum()) { + } + else if (this.type.isEnum()) + { this.isStrict = true; // it has no sense otherwise this.options = Arrays.stream(this.type.getEnumConstants()).map(e -> ((Enum) e).name().toLowerCase(Locale.ROOT)).collect(ImmutableList.toImmutableList()); - } else { + } + else + { this.options = ImmutableList.copyOf(rule.options()); } if (isStrict) @@ -70,7 +72,8 @@ public final class ParsedRule implements Comparable { public ParsedRule set(ServerCommandSource source, String value) { - //if locked - prevent + if (CarpetServer.settingsManager.locked) + return null; if (type == String.class) { return set(source, (T) value, value); @@ -95,12 +98,12 @@ public final class ParsedRule implements Comparable { } } - public ParsedRule set(ServerCommandSource source, T value, String stringValue) { + ParsedRule set(ServerCommandSource source, T value, String stringValue) { try { for (Validator validator : this.validators) { - boolean allowed = validator.validate(source, this, value, stringValue); - if (!allowed) + value = validator.validate(source, this, value, stringValue); + if (value == null) { Messenger.m(source, "r Wrong value for " + name + ": " + stringValue); return null; @@ -112,6 +115,7 @@ public final class ParsedRule implements Comparable { catch (IllegalAccessException e) { Messenger.m(source, "r Unable to access setting for "+name); + return null; } return this; } diff --git a/src/main/java/carpet/settings/Rule.java b/src/main/java/carpet/settings/Rule.java index f49854c9..62a54bab 100644 --- a/src/main/java/carpet/settings/Rule.java +++ b/src/main/java/carpet/settings/Rule.java @@ -36,7 +36,7 @@ import java.lang.annotation.Target; /** * A list of categories the rule is in */ - RuleCategory[] category(); + String[] category(); /** * Options to select in menu. @@ -47,9 +47,9 @@ import java.lang.annotation.Target; /** * if a rule is not strict - can take any value, otherwise it needs to match * any of the options - * For enums, its always strict + * For enums, its always strict, same for booleans - no need to set that for them. */ - boolean strict() default true; + boolean strict() default false; /** * The class of the validator checked when the rule is changed. diff --git a/src/main/java/carpet/settings/RuleCategory.java b/src/main/java/carpet/settings/RuleCategory.java index 990701aa..fbb952bc 100644 --- a/src/main/java/carpet/settings/RuleCategory.java +++ b/src/main/java/carpet/settings/RuleCategory.java @@ -1,13 +1,12 @@ package carpet.settings; -import java.util.Locale; +public class RuleCategory { + public static final String BUGFIX = "bugfix"; + public static final String SURVIVAL = "survival"; + public static final String CREATIVE = "creative"; + public static final String EXPERIMENTAL = "experimental"; + public static final String OPTIMIZATIONS = "optimizations"; + public static final String FEATURE = "feature"; + public static final String COMMANDS = "commands"; -public enum RuleCategory { - BUGFIX, SURVIVAL, CREATIVE, EXPERIMENTAL, OPTIMIZATIONS, FEATURE, COMMANDS ; - - public final String lowerCase; - - RuleCategory() { - this.lowerCase = this.name().toLowerCase(Locale.ROOT); - } } diff --git a/src/main/java/carpet/settings/Settings.java b/src/main/java/carpet/settings/Settings.java index 00228776..7ebe2fc7 100644 --- a/src/main/java/carpet/settings/Settings.java +++ b/src/main/java/carpet/settings/Settings.java @@ -1,5 +1,7 @@ package carpet.settings; +import net.minecraft.server.command.ServerCommandSource; + import static carpet.settings.RuleCategory.BUGFIX; import static carpet.settings.RuleCategory.COMMANDS; import static carpet.settings.RuleCategory.CREATIVE; @@ -28,11 +30,20 @@ public class Settings @Rule(desc = "fill/clone/setblock and structure blocks cause block updates", category = CREATIVE) public static boolean fillUpdates = true; + + private static class CheckFillLimitLimits extends Validator + { + @Override + Integer validate(ServerCommandSource source, ParsedRule currentRule, Integer newValue, String typedString) + { + return newValue < 20000000 ? newValue : null; + } + } @Rule( desc = "Customizable fill/clone volume limit", options = {"32768", "250000", "1000000"}, - validate = Validator.POSITIVE_NUMBER.class, - category = CREATIVE + validate = {Validator.POSITIVE_NUMBER.class, CheckFillLimitLimits.class}, + category = {CREATIVE, "skyblock"} ) public static int fillLimit = 32768; diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 34b8941a..52d2ca9d 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -11,14 +11,7 @@ import org.apache.logging.log4j.Logger; import java.io.*; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -47,6 +40,13 @@ public class SettingsManager { } } + public static Iterable getCategories() + { + Set categories = new HashSet<>(); + getRules().stream().map(r -> r.categories).forEach(categories::addAll); + return categories; + } + public ParsedRule getRule(String name) { return rules.get(name); @@ -75,7 +75,7 @@ public class SettingsManager { return server.getLevelStorage().resolveFile(server.getLevelName(), "carpet.conf"); } - public void disableBooleanFromCategory(RuleCategory category) { + public void disableBooleanFromCategory(String category) { for (ParsedRule rule : rules.values()) { if (rule.type != boolean.class || !rule.categories.contains(category)) continue; ((ParsedRule) rule).set(server.getCommandSource(), false, "false"); @@ -223,7 +223,7 @@ public class SettingsManager { String lcSearch = search.toLowerCase(Locale.ROOT); return getRulesMatching(rule -> { if (rule.name.toLowerCase(Locale.ROOT).contains(lcSearch)) return true; - for (RuleCategory c : rule.categories) if (c.lowerCase.equals(search)) return true; + for (String c : rule.categories) if (c.toLowerCase(Locale.ROOT).equals(search)) return true; return false; }); } diff --git a/src/main/java/carpet/settings/Validator.java b/src/main/java/carpet/settings/Validator.java index 9ab287ab..a950c190 100644 --- a/src/main/java/carpet/settings/Validator.java +++ b/src/main/java/carpet/settings/Validator.java @@ -11,40 +11,42 @@ public abstract class Validator { * Validate the new value of a rule * @return true if valid, false if new rule invalid. */ - abstract boolean validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string); + abstract T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string); public static class POSITIVE_NUMBER extends Validator { @Override - public boolean validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { - return newValue.doubleValue() > 0; + public T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { + return newValue.doubleValue() > 0 ? newValue : null; } } + + public static class _COMMAND extends Validator { @Override - public boolean validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { + public T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { if (CarpetServer.settingsManager != null) CarpetServer.settingsManager.notifyPlayersCommandsChanged(); - return true; + return newValue; } } public static class WIP extends Validator { @Override - public boolean validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { + public T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { if (source != null) try { Messenger.m(source, "r Work in progress - limited or no functionality available for "+currentRule.name); } catch (NullPointerException ignored) { } - return true; + return newValue; } } public static class _STRICT extends Validator { @Override - public boolean validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { + public T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) { if (!currentRule.options.contains(string.toLowerCase(Locale.ROOT))) { if (source != null) @@ -55,9 +57,9 @@ public abstract class Validator { catch (NullPointerException ignored) { } - return false; + return null; } - return true; + return newValue; } } }