From 4203121d40f7d1007ae493cf6afb84e34e41be89 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:33:00 -0700 Subject: [PATCH] basic feature loading implementation --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 40 ++++++++++++++--- .../config/PackFeatureOptionsTemplate.java | 43 +++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java 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 108cca7e4..b56ae4d5c 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,5 +1,6 @@ package com.dfsek.terra.fabric; +import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addons.TerraAddon; @@ -37,6 +38,7 @@ 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.config.templates.BiomeTemplate; +import com.dfsek.terra.fabric.config.PackFeatureOptionsTemplate; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; @@ -91,6 +93,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Supplier; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; @@ -130,9 +133,13 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final WorldHandle worldHandle = new FabricWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); - private final AddonRegistry addonRegistry = new AddonRegistry(new FabricAddon(this), this); + + private final FabricAddon fabricAddon = new FabricAddon(this); + private final AddonRegistry addonRegistry = new AddonRegistry(fabricAddon, this); private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); + private final PluginConfig config = new PluginConfig(); + private final Transformer biomeFixer = new Transformer.Builder() .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), Validator.notNull()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), Validator.notNull()).build(); @@ -246,10 +253,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { genericLoaders.register(registry); registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) - .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> biomeFixer.translate((String) o)); + .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> biomeFixer.translate((String) o)) + .registerLoader(Identifier.class, (t, o, l) -> { + Identifier identifier = Identifier.tryParse((String) o); + if(identifier == null) throw new LoadException("Invalid identifier: " + o); + return identifier; + }); } - private Biome createBiome(BiomeBuilder biome) { + private Biome createBiome(BiomeBuilder biome, ConfigPack pack) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); @@ -259,6 +271,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it. generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); + PackFeatureOptionsTemplate optionsTemplate = fabricAddon.getTemplates().get(pack); + + if(optionsTemplate.doBiomeInjection()) { + for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) { + for(Supplier> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) { + generationSettings.feature(step, featureSupplier); + } + } + } BiomeEffectsAccessor accessor = (BiomeEffectsAccessor) vanilla.getEffects(); BiomeEffects.Builder effects = new BiomeEffects.Builder() @@ -296,7 +317,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { logger.info("Loading config packs..."); registry.loadAll(this); - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. + registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome, pack)))); // Register all Terra biomes. if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { registry.forEach(pack -> { @@ -331,7 +352,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { logger.info("Loaded addons."); - Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); @@ -419,6 +439,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final TerraPlugin main; + private final Map templates = new HashMap<>(); + private FabricAddon(TerraPlugin main) { this.main = main; } @@ -451,6 +473,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { injectTree(treeRegistry, "MEGA_SPRUCE", ConfiguredFeatures.MEGA_SPRUCE); injectTree(treeRegistry, "CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI); injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI); + + PackFeatureOptionsTemplate template = new PackFeatureOptionsTemplate(); + event.addTemplate(template); + templates.put(event.getPack(), template); } @@ -460,5 +486,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } catch(DuplicateEntryException ignore) { } } + + public Map getTemplates() { + return templates; + } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java new file mode 100644 index 000000000..86956e686 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java @@ -0,0 +1,43 @@ +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 net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.List; + +public class PackFeatureOptionsTemplate implements ConfigTemplate { + @Value("features.inject-registry.enable") + @Default + private boolean doRegistryInjection = false; + + @Value("features.inject-biome.enable") + @Default + private boolean doBiomeInjection = false; + + @Value("features.inject-biome.excluded-features") + @Default + private List excludedRegistryFeatures = new ArrayList<>(); + + @Value("features.inject-biome.excluded-features") + @Default + private List excludedBiomeFeatures = new ArrayList<>(); + + public boolean doBiomeInjection() { + return doBiomeInjection; + } + + public boolean doRegistryInjection() { + return doRegistryInjection; + } + + public List getExcludedBiomeFeatures() { + return excludedBiomeFeatures; + } + + public List getExcludedRegistryFeatures() { + return excludedRegistryFeatures; + } +}