redo ConfigType and loading

This commit is contained in:
dfsek 2021-04-05 09:48:11 -07:00
parent f756ebef44
commit d96d834a08
4 changed files with 69 additions and 47 deletions

View File

@ -190,6 +190,7 @@ public class ConfigPack implements LoaderRegistrar {
for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main));
} }
@SuppressWarnings({"unchecked", "rawtypes"})
private void load(long start, TerraPlugin main) throws ConfigException { private void load(long start, TerraPlugin main) throws ConfigException {
main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this));
@ -230,7 +231,9 @@ public class ConfigPack implements LoaderRegistrar {
} }
for(Map.Entry<ConfigType<? extends ConfigTemplate>, List<Configuration>> entry : configs.entrySet()) { for(Map.Entry<ConfigType<? extends ConfigTemplate>, List<Configuration>> entry : configs.entrySet()) {
abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main)); for(ConfigTemplate config : abstractConfigLoader.loadConfigs(entry.getValue(), () -> entry.getKey().getTemplate(this, main))) {
((ConfigType) entry.getKey()).callback(this, main, config);
}
} }
main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this));

View File

@ -1,10 +1,12 @@
package com.dfsek.terra.config.prototype; package com.dfsek.terra.config.prototype;
import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
@FunctionalInterface
public interface ConfigType<T extends ConfigTemplate> { public interface ConfigType<T extends ConfigTemplate> {
T getTemplate(ConfigPack pack, TerraPlugin main); T getTemplate(ConfigPack pack, TerraPlugin main);
void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException;
} }

View File

@ -0,0 +1,62 @@
package com.dfsek.terra.registry.config;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.config.factories.BiomeFactory;
import com.dfsek.terra.config.factories.CarverFactory;
import com.dfsek.terra.config.factories.ConfigFactory;
import com.dfsek.terra.config.factories.FloraFactory;
import com.dfsek.terra.config.factories.OreFactory;
import com.dfsek.terra.config.factories.PaletteFactory;
import com.dfsek.terra.config.factories.StructureFactory;
import com.dfsek.terra.config.factories.TreeFactory;
import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.config.prototype.ConfigType;
import com.dfsek.terra.config.templates.AbstractableTemplate;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.config.templates.FloraTemplate;
import com.dfsek.terra.config.templates.OreTemplate;
import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.config.templates.TreeTemplate;
import com.dfsek.terra.registry.OpenRegistry;
import java.util.function.Function;
import java.util.function.Supplier;
public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?>> {
public ConfigTypeRegistry(ConfigPack pack, TerraPlugin main) {
add("BIOME", new ConfigBuilder<>(pack.getBiomeRegistry(), new BiomeFactory(pack), () -> new BiomeTemplate(pack, main)));
add("PALETTE", new ConfigBuilder<>(pack.getPaletteRegistry(), new PaletteFactory(), PaletteTemplate::new));
add("ORE", new ConfigBuilder<>(pack.getOreRegistry(), new OreFactory(), OreTemplate::new));
add("FLORA", new ConfigBuilder<>(pack.getFloraRegistry(), new FloraFactory(), FloraTemplate::new));
add("CARVER", new ConfigBuilder<>(pack.getCarverRegistry(), new CarverFactory(pack), CarverTemplate::new));
add("STRUCTURE", new ConfigBuilder<>(pack.getStructureRegistry(), new StructureFactory(), StructureTemplate::new));
add("TREE", new ConfigBuilder<>(pack.getTreeRegistry(), new TreeFactory(), TreeTemplate::new));
}
private static final class ConfigBuilder<T extends AbstractableTemplate, O> implements ConfigType<T> {
private final CheckedRegistry<O> registry;
private final ConfigFactory<T, O> factory;
private final Supplier<T> provider;
private ConfigBuilder(CheckedRegistry<O> registry, ConfigFactory<T, O> factory, Supplier<T> provider) {
this.registry = registry;
this.factory = factory;
this.provider = provider;
}
@Override
public T getTemplate(ConfigPack pack, TerraPlugin main) {
return provider.get();
}
@SuppressWarnings("deprecation")
@Override
public void callback(ConfigPack pack, TerraPlugin main, T loadedConfig) throws LoadException {
registry.addUnchecked(loadedConfig.getID(), factory.build(loadedConfig, main));
}
}
}

View File

@ -1,45 +0,0 @@
package com.dfsek.terra.registry.master;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.config.factories.BiomeFactory;
import com.dfsek.terra.config.factories.CarverFactory;
import com.dfsek.terra.config.factories.ConfigFactory;
import com.dfsek.terra.config.factories.FloraFactory;
import com.dfsek.terra.config.factories.OreFactory;
import com.dfsek.terra.config.factories.PaletteFactory;
import com.dfsek.terra.config.factories.StructureFactory;
import com.dfsek.terra.config.factories.TreeFactory;
import com.dfsek.terra.config.prototype.ConfigType;
import com.dfsek.terra.config.templates.AbstractableTemplate;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.config.templates.FloraTemplate;
import com.dfsek.terra.config.templates.OreTemplate;
import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.config.templates.TreeTemplate;
import com.dfsek.terra.registry.OpenRegistry;
public class ConfigTypeRegistry extends OpenRegistry<ConfigType<?>> {
public ConfigTypeRegistry() {
add("BIOME", (pack, main) -> load(pack.getBiomeRegistry(), new BiomeTemplate(pack, main), new BiomeFactory(pack), main));
add("PALETTE", (pack, main) -> load(pack.getPaletteRegistry(), new PaletteTemplate(), new PaletteFactory(), main));
add("ORE", (pack, main) -> load(pack.getOreRegistry(), new OreTemplate(), new OreFactory(), main));
add("FLORA", (pack, main) -> load(pack.getFloraRegistry(), new FloraTemplate(), new FloraFactory(), main));
add("CARVER", (pack, main) -> load(pack.getCarverRegistry(), new CarverTemplate(), new CarverFactory(pack), main));
add("STRUCTURE", (pack, main) -> load(pack.getStructureRegistry(), new StructureTemplate(), new StructureFactory(), main));
add("TREE", (pack, main) -> load(pack.getTreeRegistry(), new TreeTemplate(), new TreeFactory(), main));
}
@SuppressWarnings("deprecation")
private <T extends AbstractableTemplate, O> T load(CheckedRegistry<O> registry, T object, ConfigFactory<T, O> factory, TerraPlugin main) {
try {
registry.addUnchecked(object.getID(), factory.build(object, main));
} catch(LoadException e) {
throw new RuntimeException(e);
}
return object;
}
}