diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 0af1cea0..73b88d03 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -453,6 +453,7 @@ public class CarpetSettings "have when running commands with run()" }, category = {SCARPET}, + options = {"ops", "0", "1", "2", "3", "4"}, validate = {Validator._COMMAND_LEVEL_VALIDATOR.class, ModulePermissionLevel.class} ) public static String commandScriptACE = "ops"; @@ -484,6 +485,7 @@ public class CarpetSettings "using //contents/" }, category = SCARPET, + strict = false, validate= AppStoreManager.ScarpetAppStoreValidator.class ) public static String scriptsAppStore = "gnembon/scarpet/contents/programs"; diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index f4817972..fa80b5b7 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -991,6 +991,7 @@ public class CarpetEventServer public final String name; public final CallbackList handler; + @Deprecated public final boolean globalOnly; public final boolean isPublic; // public events can be targetted with __on_ defs public Event(String name, int reqArgs, boolean isGlobalOnly) diff --git a/src/main/java/carpet/script/utils/BiomeInfo.java b/src/main/java/carpet/script/utils/BiomeInfo.java index 4392da8b..13603ca2 100644 --- a/src/main/java/carpet/script/utils/BiomeInfo.java +++ b/src/main/java/carpet/script/utils/BiomeInfo.java @@ -21,20 +21,13 @@ import java.util.function.BiFunction; public class BiomeInfo { - // copy of from Biome.getDefaultFoliageColor - private static int getDefaultFoliageColor(Biome b) { - double d = MathHelper.clamp(b.getTemperature(), 0.0F, 1.0F); - double e = MathHelper.clamp(b.getDownfall(), 0.0F, 1.0F); - return FoliageColors.getColor(d, e); - } - public final static Map> biomeFeatures = new HashMap>(){{ put("top_material", (w, b) -> new BlockValue( b.getGenerationSettings().getSurfaceConfig().getTopMaterial(), null, null)); put("under_material", (w, b) -> new BlockValue( b.getGenerationSettings().getSurfaceConfig().getUnderMaterial(), null, null)); put("category", (w, b) -> StringValue.of(b.getCategory().getName())); put("temperature", (w, b) -> NumericValue.of(b.getTemperature())); put("fog_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMFogColor())); - put("foliage_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMFoliageColor().orElseGet(() -> getDefaultFoliageColor(b)))); + put("foliage_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMFoliageColor().orElse(4764952))); // client Biome.getDefaultFoliageColor put("sky_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMSkyColor())); put("water_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMWaterColor())); put("water_fog_color", (w, b) -> ValueConversions.ofRGB(((BiomeEffectsInterface)b.getEffects()).getCMWaterFogColor())); diff --git a/src/main/java/carpet/settings/Condition.java b/src/main/java/carpet/settings/Condition.java new file mode 100644 index 00000000..198389fe --- /dev/null +++ b/src/main/java/carpet/settings/Condition.java @@ -0,0 +1,5 @@ +package carpet.settings; + +public interface Condition { + boolean isTrue(); +} diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index ceec2686..7ec3bff6 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -163,7 +163,7 @@ public final class ParsedRule implements Comparable { { if (source != null) { - Messenger.m(source, "r Wrong value for " + name + ": " + stringValue); + validator.notifyFailure(source, this, stringValue); if (validator.description() != null) Messenger.m(source, "r " + validator.description()); } diff --git a/src/main/java/carpet/settings/Rule.java b/src/main/java/carpet/settings/Rule.java index 365d4cb3..1e638645 100644 --- a/src/main/java/carpet/settings/Rule.java +++ b/src/main/java/carpet/settings/Rule.java @@ -64,4 +64,9 @@ public @interface Rule * The class of the validator checked when the rule is changed. */ Class[] validate() default {}; + + /** + * The class of the condition checked when the rule is parsed. + */ + Class[] condition() default {}; } diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 9909ac55..b2fdd9e7 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -30,6 +30,7 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.PrintStream; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.NoSuchFileException; @@ -138,11 +139,24 @@ public class SettingsManager */ public void parseSettingsClass(Class settingsClass) { - for (Field f : settingsClass.getDeclaredFields()) + rule: for (Field f : settingsClass.getDeclaredFields()) { Rule rule = f.getAnnotation(Rule.class); if (rule == null) continue; - ParsedRule parsed = new ParsedRule(f, rule, this); + ParsedRule parsed = new ParsedRule<>(f, rule, this); + for (Class condition : rule.condition()) { + try + { + Constructor constr = condition.getDeclaredConstructor(); + constr.setAccessible(true); + if (!((Condition) constr.newInstance()).isTrue()) + continue rule; + } + catch (ReflectiveOperationException e) + { + throw new RuntimeException(e); + } + } rules.put(parsed.name, parsed); } } diff --git a/src/main/java/carpet/settings/Validator.java b/src/main/java/carpet/settings/Validator.java index 3afa6dd4..951af824 100644 --- a/src/main/java/carpet/settings/Validator.java +++ b/src/main/java/carpet/settings/Validator.java @@ -16,6 +16,10 @@ public abstract class Validator */ public abstract T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string); public String description() {return null;} + public void notifyFailure(ServerCommandSource source, ParsedRule currentRule, String providedValue) + { + Messenger.m(source, "r Wrong value for " + currentRule.name + ": " + providedValue); + } public static class _COMMAND extends Validator {