From b09d0e42aabd1ddd718955798a6b1f5c3b17bacf Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 09:06:43 -0700 Subject: [PATCH] fix biome specific exclusions --- .../events/config/ConfigPackLoadEvent.java | 19 +++++++++++- .../config/ConfigPackPostLoadEvent.java | 5 ++-- .../events/config/ConfigPackPreLoadEvent.java | 18 +---------- .../dfsek/terra/config/pack/ConfigPack.java | 8 +++-- .../dfsek/terra/fabric/TerraFabricPlugin.java | 26 ++++++++++++---- .../config/PostLoadCompatibilityOptions.java | 30 +++++++++++++++++++ ....java => PreLoadCompatibilityOptions.java} | 18 +---------- .../dfsek/terra/fabric/util/FabricUtil.java | 18 +++++++---- 8 files changed, 91 insertions(+), 51 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/{PackCompatibilityOptions.java => PreLoadCompatibilityOptions.java} (70%) diff --git a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackLoadEvent.java index 7aa7ab8a4..e995c8897 100644 --- a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackLoadEvent.java +++ b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackLoadEvent.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.event.events.config; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.config.pack.ConfigPack; @@ -8,13 +10,28 @@ import com.dfsek.terra.config.pack.ConfigPack; */ public abstract class ConfigPackLoadEvent implements PackEvent { private final ConfigPack pack; + private final ExceptionalConsumer configLoader; - public ConfigPackLoadEvent(ConfigPack pack) { + public ConfigPackLoadEvent(ConfigPack pack, ExceptionalConsumer configLoader) { this.pack = pack; + this.configLoader = configLoader; } @Override public ConfigPack getPack() { return pack; } + + /** + * Load a custom {@link ConfigTemplate} using the pack manifest. + * + * @param template Template to register. + */ + public void loadTemplate(ConfigTemplate template) throws ConfigException { + configLoader.accept(template); + } + + public interface ExceptionalConsumer { + void accept(T value) throws ConfigException; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPostLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPostLoadEvent.java index 138de647c..1398ec219 100644 --- a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPostLoadEvent.java +++ b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPostLoadEvent.java @@ -1,12 +1,13 @@ package com.dfsek.terra.api.event.events.config; +import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.config.pack.ConfigPack; /** * Called when a config pack has finished loading. */ public class ConfigPackPostLoadEvent extends ConfigPackLoadEvent { - public ConfigPackPostLoadEvent(ConfigPack pack) { - super(pack); + public ConfigPackPostLoadEvent(ConfigPack pack, ExceptionalConsumer loader) { + super(pack, loader); } } diff --git a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPreLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPreLoadEvent.java index 486f03874..1ac2de54d 100644 --- a/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPreLoadEvent.java +++ b/common/src/main/java/com/dfsek/terra/api/event/events/config/ConfigPackPreLoadEvent.java @@ -8,23 +8,7 @@ import com.dfsek.terra.config.pack.ConfigPack; * Called before a config pack's registries are filled. At this point, the pack manifest has been loaded, and all registries are empty. */ public class ConfigPackPreLoadEvent extends ConfigPackLoadEvent { - private final ExceptionalConsumer configLoader; - public ConfigPackPreLoadEvent(ConfigPack pack, ExceptionalConsumer configLoader) { - super(pack); - this.configLoader = configLoader; - } - - /** - * Load a custom {@link ConfigTemplate} using the pack manifest. - * - * @param template Template to register. - */ - public void loadTemplate(ConfigTemplate template) throws ConfigException { - configLoader.accept(template); - } - - public interface ExceptionalConsumer { - void accept(T value) throws ConfigException; + super(pack, configLoader); } } 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 b10de2b0e..871b4ebe3 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 @@ -111,6 +111,8 @@ public class ConfigPack implements LoaderRegistrar { private final TerraPlugin main; private final Loader loader; + private final Configuration configuration; + private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; @@ -131,7 +133,7 @@ public class ConfigPack implements LoaderRegistrar { File pack = new File(folder, "pack.yml"); try { - Configuration configuration = new Configuration(new FileInputStream(pack)); + configuration = new Configuration(new FileInputStream(pack)); selfLoader.load(template, configuration); main.logger().info("Loading config pack \"" + template.getID() + "\""); @@ -179,7 +181,7 @@ public class ConfigPack implements LoaderRegistrar { if(pack == null) throw new LoadException("No pack.yml file found in " + file.getName()); - Configuration configuration = new Configuration(file.getInputStream(pack)); + configuration = new Configuration(file.getInputStream(pack)); selfLoader.load(template, configuration); main.logger().info("Loading config pack \"" + template.getID() + "\""); @@ -251,7 +253,7 @@ public class ConfigPack implements LoaderRegistrar { .open("flora", ".yml").then(configs -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.loadConfigs(configs, FloraTemplate::new), main)).close() .open("biomes", ".yml").then(configs -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.loadConfigs(configs, () -> new BiomeTemplate(this, main)), main)).close(); - main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); + main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this, template -> selfLoader.load(template, configuration))); main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); } 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 3662b8a22..3778da03a 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 @@ -16,6 +16,7 @@ import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.event.TerraEventManager; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; +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; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -35,7 +36,8 @@ import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.fabric.config.PackCompatibilityOptions; +import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; +import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; @@ -295,7 +297,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final TerraPlugin main; - private final Map templates = new HashMap<>(); + private final Map> templates = new HashMap<>(); private FabricAddon(TerraPlugin main) { this.main = main; @@ -330,7 +332,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { injectTree(treeRegistry, "CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI); injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI); - PackCompatibilityOptions template = new PackCompatibilityOptions(); + PreLoadCompatibilityOptions template = new PreLoadCompatibilityOptions(); try { event.loadTemplate(template); } catch(ConfigException e) { @@ -348,7 +350,21 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } }); } - templates.put(event.getPack(), template); + templates.put(event.getPack(), Pair.of(template, null)); + } + + @Priority(Priority.HIGHEST) + @Global + public void createInjectionOptions(ConfigPackPostLoadEvent event) { + PostLoadCompatibilityOptions template = new PostLoadCompatibilityOptions(); + + try { + event.loadTemplate(template); + } catch(ConfigException e) { + e.printStackTrace(); + } + + templates.get(event.getPack()).setRight(template); } @@ -359,7 +375,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } - public Map getTemplates() { + public Map> getTemplates() { return templates; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java new file mode 100644 index 000000000..ae812bed5 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.fabric.config; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.config.builder.BiomeBuilder; +import net.minecraft.util.Identifier; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@SuppressWarnings("FieldMayBeFinal") +public class PostLoadCompatibilityOptions implements ConfigTemplate { + @Value("structures.inject-biome.exclude-biomes") + @Default + private Map> excludedPerBiomeStructures = new HashMap<>(); + + @Value("features.inject-biome.exclude-biomes") + @Default + private Map> excludedPerBiomeFeatures = new HashMap<>(); + + public Map> getExcludedPerBiomeFeatures() { + return excludedPerBiomeFeatures; + } + + public Map> getExcludedPerBiomeStructures() { + return excludedPerBiomeStructures; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java similarity index 70% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java index 32e7c62cd..bcaef6237 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Set; @SuppressWarnings("FieldMayBeFinal") -public class PackCompatibilityOptions implements ConfigTemplate { +public class PreLoadCompatibilityOptions implements ConfigTemplate { @Value("features.inject-registry.enable") @Default private boolean doRegistryInjection = false; @@ -29,18 +29,10 @@ public class PackCompatibilityOptions implements ConfigTemplate { @Default private Set excludedBiomeFeatures = new HashSet<>(); - @Value("features.inject-biome.exclude-biomes") - @Default - private Map> excludedPerBiomeFeatures = new HashMap<>(); - @Value("structures.inject-biome.excluded-features") @Default private Set excludedBiomeStructures = new HashSet<>(); - @Value("structures.inject-biome.exclude-biomes") - @Default - private Map> excludedPerBiomeStructures = new HashMap<>(); - public boolean doBiomeInjection() { return doBiomeInjection; } @@ -57,14 +49,6 @@ public class PackCompatibilityOptions implements ConfigTemplate { return excludedRegistryFeatures; } - public Map> getExcludedPerBiomeFeatures() { - return excludedPerBiomeFeatures; - } - - public Map> getExcludedPerBiomeStructures() { - return excludedPerBiomeStructures; - } - public Set getExcludedBiomeStructures() { return excludedBiomeStructures; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index fdf4abcb3..9932d85c0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -1,10 +1,12 @@ package com.dfsek.terra.fabric.util; +import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.config.PackCompatibilityOptions; +import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; +import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -53,23 +55,27 @@ public final class FabricUtil { } } - PackCompatibilityOptions compatibilityOptions = fabricAddon.getTemplates().get(pack); + Pair pair = fabricAddon.getTemplates().get(pack); + PreLoadCompatibilityOptions compatibilityOptions = pair.getLeft(); + PostLoadCompatibilityOptions postLoadCompatibilityOptions = pair.getRight(); + + TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting Vanilla structures and features into Terra biome " + biome.getTemplate().getID()); for(Supplier> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { Identifier key = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(structureFeature.get()); - if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !compatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { + if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.structureFeature(structureFeature.get()); + TerraFabricPlugin.getInstance().getDebugLogger().info("Injected structure " + key); } } if(compatibilityOptions.doBiomeInjection()) { - TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting features into " + biome.getTemplate().getID()); for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) { for(Supplier> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) { Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get()); - if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !compatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { + if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.feature(step, featureSupplier); - TerraFabricPlugin.getInstance().getDebugLogger().info("Injected " + key + " at stage " + step); + TerraFabricPlugin.getInstance().getDebugLogger().info("Injected feature " + key + " at stage " + step); } } }