diff --git a/common/addons/language-yaml/build.gradle.kts b/common/addons/language-yaml/build.gradle.kts index 075399c88..07542d899 100644 --- a/common/addons/language-yaml/build.gradle.kts +++ b/common/addons/language-yaml/build.gradle.kts @@ -16,8 +16,6 @@ dependencies { "shadedApi"(project(":common:api")) "compileOnly"("com.google.guava:guava:30.0-jre") - "shadedApi"("com.dfsek.tectonic:yaml:2.0.0") - "testImplementation"("com.google.guava:guava:30.0-jre") } diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 942d4654f..43ffb3413 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -13,9 +13,10 @@ configureDependencies() group = "com.dfsek.terra.common" dependencies { - "shadedApi"("com.dfsek:Paralithic:0.3.2") - "shadedApi"("com.dfsek.tectonic:common:2.0.0") + + "shadedApi"("com.dfsek.tectonic:common:2.1.0") + "shadedApi"("com.dfsek.tectonic:yaml:2.1.0") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java index 6efc507f3..59cec4008 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java @@ -11,12 +11,6 @@ import java.util.Map; import java.util.Set; public interface Loader { - /** - * Do something with the InputStreams. - * - * @param consumer Something to do with the streams. - */ - Loader then(ExceptionalConsumer> consumer) throws ConfigException; Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException; diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java index d7b1adecc..6951103c9 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java @@ -5,6 +5,7 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.terra.api.Logger; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.util.JarUtil; @@ -80,7 +81,7 @@ public class PluginConfigImpl implements ConfigTemplate, com.dfsek.terra.api.con logger.info("Loading config values"); try(FileInputStream file = new FileInputStream(new File(main.getDataFolder(), "config.yml"))) { ConfigLoader loader = new ConfigLoader(); - loader.load(this, file); + loader.load(this, new YamlConfiguration(file, "config.yml")); if(dumpDefaultConfig) { // Don't dump default config if already loaded. try(JarFile jar = main.getModJar()) { JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString()); diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java index f523a8329..8f1c17fa2 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/fileloaders/LoaderImpl.java @@ -1,6 +1,5 @@ package com.dfsek.terra.config.fileloaders; -import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.util.function.ExceptionalConsumer; @@ -16,21 +15,6 @@ import java.util.Set; public abstract class LoaderImpl implements Loader { protected final Map streams = new HashMap<>(); - /** - * Do something with the InputStreams. - * - * @param consumer Something to do with the streams. - */ - @Override - public Loader then(ExceptionalConsumer> consumer) throws ConfigException { - List list = new ArrayList<>(); - streams.forEach((id, stream) -> { - list.add(new Configuration(stream, id)); - }); - consumer.accept(list); - return this; - } - @Override public Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException { consumer.accept(new ArrayList<>(streams.keySet())); diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/lang/LanguageImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/lang/LanguageImpl.java index 2227c2269..1b35fc82e 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/lang/LanguageImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/lang/LanguageImpl.java @@ -2,6 +2,7 @@ package com.dfsek.terra.config.lang; import com.dfsek.tectonic.config.Configuration; +import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.lang.Message; @@ -16,7 +17,7 @@ public class LanguageImpl implements com.dfsek.terra.api.lang.Language { private final Configuration configuration; public LanguageImpl(File file) throws IOException { - configuration = new Configuration(new FileInputStream(file)); + configuration = new YamlConfiguration(new FileInputStream(file), file.getName()); } @Override diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/LinkedHashMapLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/LinkedHashMapLoader.java index 5de7cbe9b..bfee3f438 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/LinkedHashMapLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/LinkedHashMapLoader.java @@ -4,6 +4,8 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import java.lang.reflect.AnnotatedParameterizedType; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.LinkedHashMap; @@ -12,13 +14,13 @@ import java.util.Map; @SuppressWarnings("unchecked") public class LinkedHashMapLoader implements TypeLoader> { @Override - public LinkedHashMap load(Type t, Object c, ConfigLoader loader) throws LoadException { + public LinkedHashMap load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { Map config = (Map) c; LinkedHashMap map = new LinkedHashMap<>(); - if(t instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) t; - Type key = pType.getActualTypeArguments()[0]; - Type value = pType.getActualTypeArguments()[1]; + if(t instanceof AnnotatedParameterizedType) { + AnnotatedParameterizedType pType = (AnnotatedParameterizedType) t; + AnnotatedType key = pType.getAnnotatedActualTypeArguments()[0]; + AnnotatedType value = pType.getAnnotatedActualTypeArguments()[1]; for(Map.Entry entry : config.entrySet()) { map.put(loader.loadType(key, entry.getKey()), loader.loadType(value, entry.getValue())); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index a397e1d77..67bb00628 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -6,19 +6,20 @@ import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.util.collection.MaterialSet; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.Type; import java.util.List; @SuppressWarnings("unchecked") public class MaterialSetLoader implements TypeLoader { @Override - public MaterialSet load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + public MaterialSet load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException { List stringData = (List) o; MaterialSet set = new MaterialSet(); for(String string : stringData) { try { - set.add(configLoader.loadClass(BlockType.class, string)); + set.add(configLoader.loadType(BlockType.class, string)); } catch(NullPointerException e) { throw new LoadException("Invalid data identifier \"" + string + "\"", e); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 8aec1f63e..741c9d730 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -5,6 +5,8 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import java.lang.reflect.AnnotatedParameterizedType; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; @@ -13,12 +15,12 @@ import java.util.Map; @SuppressWarnings("unchecked") public class ProbabilityCollectionLoader implements TypeLoader> { @Override - public ProbabilityCollection load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + public ProbabilityCollection load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException { ProbabilityCollection collection = new ProbabilityCollection<>(); - if(type instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) type; - Type generic = pType.getActualTypeArguments()[0]; + if(type instanceof AnnotatedParameterizedType) { + AnnotatedParameterizedType pType = (AnnotatedParameterizedType) type; + AnnotatedType generic = pType.getAnnotatedActualTypeArguments()[0]; if(o instanceof Map) { Map map = (Map) o; for(Map.Entry entry : map.entrySet()) { diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java index bec15d16d..8ab1d7530 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java @@ -6,13 +6,14 @@ import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.util.ConstantRange; import com.dfsek.terra.api.util.Range; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") public class RangeLoader implements TypeLoader { @Override - public Range load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + public Range load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException { Map map = (Map) o; return new ConstantRange(map.get("min"), map.get("max")); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java index 0b450ea67..f50dc395f 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.config.Loader; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.Type; public class BufferedImageLoader implements TypeLoader { @@ -18,7 +19,7 @@ public class BufferedImageLoader implements TypeLoader { } @Override - public BufferedImage load(Type t, Object c, ConfigLoader loader) throws LoadException { + public BufferedImage load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { try { return ImageIO.read(files.get((String) c)); } catch(IOException e) { diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java index f30b77814..d316718bb 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java @@ -5,13 +5,14 @@ import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.structure.StructureSpawn; import com.dfsek.terra.math.GridSpawn; +import java.lang.reflect.AnnotatedType; import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") public class GridSpawnLoader implements TypeLoader { @Override - public StructureSpawn load(Type type, Object o, ConfigLoader configLoader) { + public StructureSpawn load(AnnotatedType type, Object o, ConfigLoader configLoader) { Map map = (Map) o; return new GridSpawn(map.get("width"), map.get("padding"), map.getOrDefault("salt", 0)); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index fb2db617c..abbf7a0fb 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.pack; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.abstraction.TemplateProvider; +import com.dfsek.tectonic.abstraction.AbstractConfiguration; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; @@ -11,15 +11,16 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; -import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; @@ -106,7 +107,7 @@ public class ConfigPackImpl implements ConfigPack { File pack = new File(folder, "pack.yml"); try { - configuration = new Configuration(new FileInputStream(pack)); + this.configuration = new YamlConfiguration(new FileInputStream(pack), "pack.yml"); ConfigPackAddonsTemplate addonsTemplate = new ConfigPackAddonsTemplate(); selfLoader.load(addonsTemplate, configuration); @@ -120,7 +121,7 @@ public class ConfigPackImpl implements ConfigPack { load(l, main); ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); - selfLoader.load(packPostTemplate, new FileInputStream(pack)); + selfLoader.load(packPostTemplate, configuration); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. checkDeadEntries(main); @@ -162,7 +163,7 @@ public class ConfigPackImpl implements ConfigPack { if(pack == null) throw new LoadException("No pack.yml file found in " + file.getName()); - configuration = new Configuration(file.getInputStream(pack)); + this.configuration = new YamlConfiguration(file.getInputStream(pack), "pack.yml"); ConfigPackAddonsTemplate addonsTemplate = new ConfigPackAddonsTemplate(); selfLoader.load(addonsTemplate, configuration); @@ -178,7 +179,7 @@ public class ConfigPackImpl implements ConfigPack { ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); - selfLoader.load(packPostTemplate, file.getInputStream(pack)); + selfLoader.load(packPostTemplate, configuration); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); biomeProviderBuilder.build(0); // Build dummy provider to catch errors at load time. checkDeadEntries(main); @@ -225,7 +226,7 @@ public class ConfigPackImpl implements ConfigPack { List configurations = new ArrayList<>(); - loader.open("", ".yml").thenEntries(entries -> entries.forEach(stream -> configurations.add(new Configuration(stream.getValue(), stream.getKey())))); + main.getEventManager().callEvent(new ConfigurationLoadEvent(this, loader, configurations::add)); Map, List> configs = new HashMap<>(); @@ -236,9 +237,10 @@ public class ConfigPackImpl implements ConfigPack { } for(ConfigType configType : configTypeRegistry.entries()) { - for(AbstractableTemplate config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()), () -> configType.getTemplate(this, main))) { + CheckedRegistry registry = getCheckedRegistry(configType.getTypeClass()); + for(AbstractConfiguration config : abstractConfigLoader.loadConfigs(configs.getOrDefault(configType, Collections.emptyList()))) { try { - ((CheckedRegistry) getCheckedRegistry(configType.getTypeClass())).register(config.getID(), ((ConfigFactory) configType.getFactory()).build(config, main)); + registry.register(config.getID(), ((ConfigFactory) configType.getFactory()).build(selfLoader.load(configType.getTemplate(this, main), config), main)); } catch(DuplicateEntryException e) { throw new LoadException("Duplicate registry entry: ", e); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 07dd85f99..6784991d5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -1,6 +1,5 @@ package com.dfsek.terra.fabric; -import com.dfsek.tectonic.abstraction.TemplateProvider; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeLoader; @@ -83,6 +82,7 @@ import java.io.InputStream; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @@ -93,7 +93,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Map> worldMap = new HashMap<>(); private final Map> loaders = new HashMap<>(); - private final Map>> objectLoaders = new HashMap<>(); + private final Map>> objectLoaders = new HashMap<>(); private final EventManager eventManager = new EventManagerImpl(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Profiler profiler = new ProfilerImpl(); @@ -244,7 +244,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return identifier; }); loaders.forEach(registry::registerLoader); - objectLoaders.forEach((t, l) -> registry.registerLoader(t, (TemplateProvider>) ((Object) l))); + objectLoaders.forEach((t, l) -> registry.registerLoader(t, (Supplier>) ((Object) l))); } @Override @@ -301,8 +301,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @SuppressWarnings("unchecked") @Override - public TerraFabricPlugin applyLoader(Type type, TemplateProvider> loader) { - objectLoaders.put(type, (TemplateProvider>) ((Object) loader)); + public TerraFabricPlugin applyLoader(Type type, Supplier> loader) { + objectLoaders.put(type, (Supplier>) ((Object) loader)); return this; }