diff --git a/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java b/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java index 998096989..1bb00f2f6 100644 --- a/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java +++ b/common/src/main/java/com/dfsek/terra/api/config/meta/MetaContext.java @@ -1,10 +1,16 @@ package com.dfsek.terra.api.config.meta; -import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.tectonic.exception.LoadException; + +import java.lang.reflect.Type; /** * Context from which to pull {@link MetaValue}s */ public interface MetaContext { - T load(String meta, Class clazz) throws ConfigException; + default T load(String meta, Class clazz) throws LoadException { + return load(meta, (Type) clazz); + } + + T load(String meta, Type type) throws LoadException; } 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 459f87ed5..d81295a38 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 @@ -4,25 +4,26 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.api.config.meta.MetaContext; import com.dfsek.terra.api.config.meta.MetaValue; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericMetaValueLoader extends MetaValueLoader, Object> { - protected GenericMetaValueLoader(MetaContext context) { + public GenericMetaValueLoader(MetaContext context) { super(context); } @Override public MetaValue load(Type type, Object c, ConfigLoader loader) throws LoadException { - ProbabilityCollection collection = new ProbabilityCollection<>(); - if(type instanceof ParameterizedType) { ParameterizedType pType = (ParameterizedType) type; Type generic = pType.getActualTypeArguments()[0]; if(c instanceof String) { - + String possibleMeta = (String) c; + if(possibleMeta.startsWith("$")) { + String meta = possibleMeta.substring(1); + return context.load(meta, generic); + } } return MetaValue.of(loader.loadType(generic, c)); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index 871b4ebe3..898242ab6 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -10,6 +10,7 @@ import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.config.meta.MetaValue; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.platform.block.BlockData; @@ -42,6 +43,8 @@ import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProvi import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; +import com.dfsek.terra.config.loaders.meta.GenericMetaValueLoader; +import com.dfsek.terra.config.pack.meta.PackMetaContext; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; @@ -115,6 +118,8 @@ public class ConfigPack implements LoaderRegistrar { private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; + private final PackMetaContext context; + public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { @@ -124,6 +129,9 @@ public class ConfigPack implements LoaderRegistrar { floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(); + + context = new PackMetaContext(loader, selfLoader); + register(abstractConfigLoader); register(selfLoader); @@ -165,6 +173,9 @@ public class ConfigPack implements LoaderRegistrar { floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(); + + context = new PackMetaContext(loader, selfLoader); + register(abstractConfigLoader); register(selfLoader); @@ -295,7 +306,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)) - .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); + .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)) + .registerLoader(MetaValue.class, new GenericMetaValueLoader(context)); } public Set getCarvers() { diff --git a/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java b/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java index 456fb92d1..698b067c3 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/meta/PackMetaContext.java @@ -1,13 +1,13 @@ package com.dfsek.terra.config.pack.meta; import com.dfsek.tectonic.config.Configuration; -import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.api.config.meta.MetaContext; import com.dfsek.terra.config.fileloaders.Loader; import java.io.IOException; +import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; @@ -21,8 +21,9 @@ public class PackMetaContext implements MetaContext { this.loader = loader; } + @SuppressWarnings("unchecked") @Override - public T load(String meta, Class clazz) throws ConfigException { + public T load(String meta, Type clazz) throws LoadException { if(meta.indexOf(":") != meta.lastIndexOf(":")) { // We just need to know if there are >1. throw new LoadException("Malformed metavalue string: " + meta); } @@ -42,6 +43,6 @@ public class PackMetaContext implements MetaContext { throw new LoadException("Failed to load config file \"" + file + "\":", e); } - return loader.loadClass(clazz, configuration.get(key)); + return (T) loader.loadType(clazz, configuration.get(key)); } }