diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java index f3fbf4f88..f0c09a41c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java @@ -18,7 +18,7 @@ public interface ConfigPack extends LoaderRegistrar, LoaderHolder, RegistryHolde WorldConfig toWorldConfig(TerraWorld world); - void registerConfigType(ConfigType type, int priority); + void registerConfigType(ConfigType type, String id, int priority); Set addons(); 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 1c52dc68d..d8f947c78 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 @@ -42,14 +42,17 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.Serial; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -77,9 +80,11 @@ public class ConfigPackImpl implements ConfigPack { private final ConfigTypeRegistry configTypeRegistry; private final Map, ImmutablePair, CheckedRegistry>> registryMap = newRegistryMap(); + private final TreeMap>>> configTypes = new TreeMap<>(); + public ConfigPackImpl(File folder, TerraPlugin main) throws ConfigException { try { - this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + this.configTypeRegistry = new ConfigTypeRegistry((id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistryImpl<>(openRegistry))); }); @@ -122,7 +127,7 @@ public class ConfigPackImpl implements ConfigPack { public ConfigPackImpl(ZipFile file, TerraPlugin main) throws ConfigException { try { - this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { + this.configTypeRegistry = new ConfigTypeRegistry((id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistryImpl<>(openRegistry))); }); @@ -168,9 +173,9 @@ public class ConfigPackImpl implements ConfigPack { toWorldConfig(new TerraWorldImpl(new DummyWorld(), this, main)); // Build now to catch any errors immediately. } - @SuppressWarnings({"unchecked", "rawtypes"}) private Map, ImmutablePair, CheckedRegistry>> newRegistryMap() { Map, ImmutablePair, CheckedRegistry>> map = new HashMap, ImmutablePair, CheckedRegistry>>() { + @Serial private static final long serialVersionUID = 4015855819914064466L; @Override @@ -214,6 +219,8 @@ public class ConfigPackImpl implements ConfigPack { @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { + configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.add(pair.getLeft(), pair.getRight()))); + for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey(), var.getValue()); } @@ -291,8 +298,13 @@ public class ConfigPackImpl implements ConfigPack { } @Override - public void registerConfigType(ConfigType type, int priority) { - + public void registerConfigType(ConfigType type, String id, int priority) { + Set contained = new HashSet<>(); + configTypes.forEach((p, configs) -> configs.forEach(pair -> { + if(contained.contains(pair.getLeft())) throw new IllegalArgumentException("Duplicate config ID: " + id); + contained.add(id); + })); + configTypes.computeIfAbsent(priority, p -> new ArrayList<>()).add(ImmutablePair.of(id, type)); } @Override diff --git a/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java b/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java index 58e32a83e..0f216b884 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java +++ b/common/implementation/src/main/java/com/dfsek/terra/registry/config/ConfigTypeRegistry.java @@ -18,7 +18,7 @@ import java.util.function.Supplier; public class ConfigTypeRegistry extends OpenRegistryImpl> { private final BiConsumer> callback; - public ConfigTypeRegistry(ConfigPackImpl pack, TerraPlugin main, BiConsumer> callback) { + public ConfigTypeRegistry(BiConsumer> callback) { super(new LinkedHashMap<>()); // Ordered this.callback = callback; add("PACK", new PackBuilder());