categories not an enum, so its easier to extend. Validators can modify value.

This commit is contained in:
gnembon committed 2019-06-11 12:27:26 -03:00
1 parent 92f40c36b8
commit f05c661fbf
7 files changed
+65 -54

No files matched your search

@@ -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<BaseText> 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<Object> 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");
+16 -12
View File
@@ -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<T> implements Comparable<ParsedRule> {
public final Rule rule;
public final Field field;
public final String name;
public final String description;
public final ImmutableList<String> extraInfo;
public final ImmutableList<RuleCategory> categories;
public final ImmutableList<String> categories;
public final ImmutableList<String> options;
public boolean isStrict;
public final Class<T> type;
@@ -37,7 +36,6 @@ public final class ParsedRule<T> implements Comparable<ParsedRule> {
}
ParsedRule(Field field, Rule rule) {
this.rule = rule;
this.field = field;
this.name = rule.name().isEmpty() ? field.getName() : rule.name();
this.type = (Class<T>) field.getType();
@@ -52,16 +50,20 @@ public final class ParsedRule<T> implements Comparable<ParsedRule> {
}
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<T> implements Comparable<ParsedRule> {
public ParsedRule<T> 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<T> implements Comparable<ParsedRule> {
}
}
public ParsedRule<T> set(ServerCommandSource source, T value, String stringValue) {
ParsedRule<T> set(ServerCommandSource source, T value, String stringValue) {
try {
for (Validator<T> 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<T> implements Comparable<ParsedRule> {
catch (IllegalAccessException e)
{
Messenger.m(source, "r Unable to access setting for "+name);
return null;
}
return this;
}
+3 -3
View File
@@ -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.
@@ -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);
}
}
+13 -2
View File
@@ -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<Integer>
{
@Override
Integer validate(ServerCommandSource source, ParsedRule<Integer> 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;
@@ -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<String> getCategories()
{
Set<String> 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<Boolean>) 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;
});
}
+12 -10
View File
@@ -11,40 +11,42 @@ public abstract class Validator<T> {
* Validate the new value of a rule
* @return true if valid, false if new rule invalid.
*/
abstract boolean validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string);
abstract T validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string);
public static class POSITIVE_NUMBER<T extends Number> extends Validator<T> {
@Override
public boolean validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
return newValue.doubleValue() > 0;
public T validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
return newValue.doubleValue() > 0 ? newValue : null;
}
}
public static class _COMMAND<T> extends Validator<T> {
@Override
public boolean validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
public T validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
if (CarpetServer.settingsManager != null)
CarpetServer.settingsManager.notifyPlayersCommandsChanged();
return true;
return newValue;
}
}
public static class WIP<T> extends Validator<T> {
@Override
public boolean validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
public T validate(ServerCommandSource source, ParsedRule<T> 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<T> extends Validator<T> {
@Override
public boolean validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
public T validate(ServerCommandSource source, ParsedRule<T> currentRule, T newValue, String string) {
if (!currentRule.options.contains(string.toLowerCase(Locale.ROOT)))
{
if (source != null)
@@ -55,9 +57,9 @@ public abstract class Validator<T> {
catch (NullPointerException ignored)
{
}
return false;
return null;
}
return true;
return newValue;
}
}
}