From 571a5fdf3a82185d5618068f42f6ed3a86a95584 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Jun 2021 01:33:06 -0700 Subject: [PATCH] meta values in config manifest --- .../com/dfsek/terra/api/util/MapUtil.java | 18 ++++ .../dfsek/terra/api/util/generic/Lazy.java | 23 +++++ .../loaders/meta/GenericMetaValueLoader.java | 2 +- .../config/pack/ConfigPackPostTemplate.java | 5 +- .../terra/config/pack/ConfigPackTemplate.java | 88 ++++++++++--------- 5 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/util/MapUtil.java create mode 100644 common/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java diff --git a/common/src/main/java/com/dfsek/terra/api/util/MapUtil.java b/common/src/main/java/com/dfsek/terra/api/util/MapUtil.java new file mode 100644 index 000000000..2e421927b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/MapUtil.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +public final class MapUtil { + public static > M remap(Function keys, Function values, Map in, Supplier newMap) { + M map = newMap.get(); + in.forEach((k, v) -> map.put(keys.apply(k), values.apply(v))); + return map; + } + + public static Map remap(Function keys, Function values, Map in) { + return remap(keys, values, in, HashMap::new); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java new file mode 100644 index 000000000..928bd3cf8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Supplier; + +public final class Lazy { + private final Supplier fetch; + + private T value; + + private boolean needsInit = true; + + public Lazy(Supplier fetch) { + this.fetch = fetch; + } + + public T get() { + if(needsInit) { + value = fetch.get(); + needsInit = false; + } + return value; + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java index d81295a38..8a0ccf609 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/meta/GenericMetaValueLoader.java @@ -22,7 +22,7 @@ public class GenericMetaValueLoader extends MetaValueLoader, O String possibleMeta = (String) c; if(possibleMeta.startsWith("$")) { String meta = possibleMeta.substring(1); - return context.load(meta, generic); + return MetaValue.of(context.load(meta, generic)); } } diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java index dd24def46..529973534 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackPostTemplate.java @@ -2,13 +2,14 @@ package com.dfsek.terra.config.pack; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.api.config.meta.MetaValue; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; public class ConfigPackPostTemplate implements ConfigTemplate { @Value("biomes") - private BiomeProvider.BiomeProviderBuilder providerBuilder; + private MetaValue providerBuilder; public BiomeProvider.BiomeProviderBuilder getProviderBuilder() { - return providerBuilder; + return providerBuilder.get(); } } diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java index bfebcb717..3b7fb8169 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java @@ -4,6 +4,9 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.api.addons.TerraAddon; +import com.dfsek.terra.api.config.meta.MetaValue; +import com.dfsek.terra.api.util.MapUtil; +import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; @@ -12,14 +15,24 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import java.util.function.Function; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class ConfigPackTemplate implements ConfigTemplate { @Value("id") private String id; + @Value("version") + @Default + private String version = "0.1.0"; + + @Value("author") + @Default + private String author = "Anon Y. Mous"; + @Value("noise") - private Map noiseBuilderMap; + private Map> noiseBuilderMap; + private final Lazy> lazyNoiseBuilderMap = new Lazy<>(() -> MapUtil.remap(Function.identity(), MetaValue::get, noiseBuilderMap)); @Value("addons") @Default @@ -27,94 +40,89 @@ public class ConfigPackTemplate implements ConfigTemplate { @Value("variables") @Default - private Map variables = new HashMap<>(); + private Map> variables = new HashMap<>(); + private final Lazy> lazyVariables = new Lazy<>(() -> MapUtil.remap(Function.identity(), MetaValue::get, variables)); @Value("beta.carving") @Default - private boolean betaCarvers = false; + private MetaValue betaCarvers = MetaValue.of(false); @Value("functions") @Default - private LinkedHashMap functions = new LinkedHashMap<>(); + private LinkedHashMap> functions = new LinkedHashMap<>(); + private final Lazy> lazyFunctions = new Lazy<>(() -> MapUtil.remap(Function.identity(), MetaValue::get, functions, LinkedHashMap::new)); @Value("structures.locatable") @Default - private Map locatable = new HashMap<>(); + private Map> locatable = new HashMap<>(); + private final Lazy> lazyLocatable = new Lazy<>(() -> MapUtil.remap(Function.identity(), MetaValue::get, locatable)); @Value("blend.terrain.elevation") @Default - private int elevationBlend = 4; + private MetaValue elevationBlend = MetaValue.of(4); @Value("vanilla.mobs") @Default - private boolean vanillaMobs = true; + private MetaValue vanillaMobs = MetaValue.of(true); @Value("vanilla.caves") @Default - private boolean vanillaCaves = false; + private MetaValue vanillaCaves = MetaValue.of(false); @Value("vanilla.decorations") @Default - private boolean vanillaDecorations = false; + private MetaValue vanillaDecorations = MetaValue.of(false); @Value("vanilla.structures") @Default - private boolean vanillaStructures = false; - - @Value("author") - @Default - private String author = "Anon Y. Mous"; + private MetaValue vanillaStructures = MetaValue.of(false); @Value("disable.sapling") @Default - private boolean disableSaplings = false; - - @Value("version") - @Default - private String version = "0.1.0"; + private MetaValue disableSaplings = MetaValue.of(false); @Value("disable.carvers") @Default - private boolean disableCarvers = false; + private MetaValue disableCarvers = MetaValue.of(false); @Value("disable.structures") @Default - private boolean disableStructures = false; + private MetaValue disableStructures = MetaValue.of(false); @Value("disable.ores") @Default - private boolean disableOres = false; + private MetaValue disableOres = MetaValue.of(false); @Value("disable.trees") @Default - private boolean disableTrees = false; + private MetaValue disableTrees = MetaValue.of(false); @Value("disable.flora") @Default - private boolean disableFlora = false; + private MetaValue disableFlora = MetaValue.of(false); public boolean disableCarvers() { - return disableCarvers; + return disableCarvers.get(); } public boolean disableFlora() { - return disableFlora; + return disableFlora.get(); } public boolean disableOres() { - return disableOres; + return disableOres.get(); } public boolean disableStructures() { - return disableStructures; + return disableStructures.get(); } public boolean disableTrees() { - return disableTrees; + return disableTrees.get(); } public LinkedHashMap getFunctions() { - return functions; + return lazyFunctions.get(); } public String getVersion() { @@ -122,7 +130,7 @@ public class ConfigPackTemplate implements ConfigTemplate { } public boolean isDisableSaplings() { - return disableSaplings; + return disableSaplings.get(); } public String getID() { @@ -134,39 +142,39 @@ public class ConfigPackTemplate implements ConfigTemplate { } public boolean vanillaMobs() { - return vanillaMobs; + return vanillaMobs.get(); } public boolean vanillaCaves() { - return vanillaCaves; + return vanillaCaves.get(); } public boolean vanillaDecorations() { - return vanillaDecorations; + return vanillaDecorations.get(); } public boolean vanillaStructures() { - return vanillaStructures; + return vanillaStructures.get(); } public Map getNoiseBuilderMap() { - return noiseBuilderMap; + return lazyNoiseBuilderMap.get(); } public Map getVariables() { - return variables; + return lazyVariables.get(); } public int getElevationBlend() { - return elevationBlend; + return elevationBlend.get(); } public Map getLocatable() { - return locatable; + return lazyLocatable.get(); } public boolean doBetaCarvers() { - return betaCarvers; + return betaCarvers.get(); } public Set getAddons() {