From 32db83f091a1ed559a61b99309b7088708434b6e Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 11 May 2021 23:56:08 -0700 Subject: [PATCH 01/28] remove NotNullValidator --- .../com/dfsek/terra/api/transform/NotNullValidator.java | 8 -------- .../java/com/dfsek/terra/api/transform/Validator.java | 6 ++++++ .../java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 6 +++--- .../main/java/com/dfsek/terra/forge/TerraForgePlugin.java | 6 +++--- 4 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java diff --git a/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java b/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java deleted file mode 100644 index b94b7be39..000000000 --- a/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.transform; - -public class NotNullValidator implements Validator { - @Override - public boolean validate(T value) { - return !(value == null); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/transform/Validator.java b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java index c9ba5db9e..b22b7c08b 100644 --- a/common/src/main/java/com/dfsek/terra/api/transform/Validator.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java @@ -1,6 +1,12 @@ package com.dfsek.terra.api.transform; +import java.util.Objects; + public interface Validator { boolean validate(T value) throws TransformException; + + static Validator notNull() { + return Objects::nonNull; + } } 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 f53c0fc7a..108cca7e4 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 @@ -25,8 +25,8 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.api.transform.Validator; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.commands.CommandUtil; @@ -134,8 +134,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { 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)), new NotNullValidator<>()) - .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), Validator.notNull()) + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), Validator.notNull()).build(); private File dataFolder; public static TerraFabricPlugin getInstance() { diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index b7cab9f61..b5e76ef94 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -24,8 +24,8 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.api.transform.Validator; import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.mutable.MutableInteger; @@ -149,8 +149,8 @@ public class TerraForgePlugin implements TerraPlugin { private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); private final PluginConfig config = new PluginConfig(); private final Transformer biomeFixer = new Transformer.Builder() - .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse(id)), new NotNullValidator<>()) - .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse(id)), Validator.notNull()) + .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse("minecraft:" + id.toLowerCase())), Validator.notNull()).build(); private File dataFolder; public TerraForgePlugin() { From 82fe6d5aa4d4ff5975da504bfcb3ac86de3cb8f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:09:21 -0700 Subject: [PATCH 02/28] add api to load custom values from pack manifest. --- .../events/config/ConfigPackPreLoadEvent.java | 19 +++++++++++++++ .../dfsek/terra/config/pack/ConfigPack.java | 24 +++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) 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 317603c9e..390fd8aab 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 @@ -1,7 +1,11 @@ package com.dfsek.terra.api.event.events.config; +import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.config.pack.ConfigPack; +import java.util.ArrayList; +import java.util.List; + /** * Called before a config pack's registries are filled. At this point, the pack manifest has been loaded, and all registries are empty. */ @@ -9,4 +13,19 @@ public class ConfigPackPreLoadEvent extends ConfigPackLoadEvent { public ConfigPackPreLoadEvent(ConfigPack pack) { super(pack); } + + private final List templates = new ArrayList<>(); + + /** + * Add an additional config template to load using the pack manifest. + * + * @param template Template to register. + */ + public void addTemplate(ConfigTemplate template) { + templates.add(template); + } + + public List getTemplates() { + return new ArrayList<>(templates); + } } 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 02772f633..737c76412 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 @@ -2,6 +2,8 @@ package com.dfsek.terra.config.pack; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.abstraction.AbstractConfigLoader; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; @@ -130,11 +132,19 @@ public class ConfigPack implements LoaderRegistrar { File pack = new File(folder, "pack.yml"); try { - selfLoader.load(template, new FileInputStream(pack)); + Configuration configuration = new Configuration(new FileInputStream(pack)); + selfLoader.load(template, configuration); main.logger().info("Loading config pack \"" + template.getID() + "\""); + ConfigPackPreLoadEvent event = new ConfigPackPreLoadEvent(this); + main.getEventManager().callEvent(event); + for(ConfigTemplate eventTemplate : event.getTemplates()) { + selfLoader.load(eventTemplate, configuration); + } + load(l, main); + ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); selfLoader.load(packPostTemplate, new FileInputStream(pack)); biomeProviderBuilder = packPostTemplate.getProviderBuilder(); @@ -174,9 +184,17 @@ public class ConfigPack implements LoaderRegistrar { if(pack == null) throw new LoadException("No pack.yml file found in " + file.getName()); - selfLoader.load(template, file.getInputStream(pack)); + Configuration configuration = new Configuration(file.getInputStream(pack)); + selfLoader.load(template, configuration); main.logger().info("Loading config pack \"" + template.getID() + "\""); + ConfigPackPreLoadEvent event = new ConfigPackPreLoadEvent(this); + main.getEventManager().callEvent(event); + for(ConfigTemplate eventTemplate : event.getTemplates()) { + selfLoader.load(eventTemplate, configuration); + } + + load(l, main); ConfigPackPostTemplate packPostTemplate = new ConfigPackPostTemplate(); @@ -211,8 +229,6 @@ public class ConfigPack implements LoaderRegistrar { private void load(long start, TerraPlugin main) throws ConfigException { - main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); - for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey(), var.getValue()); } From 4203121d40f7d1007ae493cf6afb84e34e41be89 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:33:00 -0700 Subject: [PATCH 03/28] 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; + } +} From fa647e1e2c93f8d0e3bcab709897284f9a7c2c5e Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:48:38 -0700 Subject: [PATCH 04/28] make loadConfig less jank --- .../events/config/ConfigPackPreLoadEvent.java | 21 +++++++++---------- .../dfsek/terra/config/pack/ConfigPack.java | 14 ++----------- .../dfsek/terra/fabric/TerraFabricPlugin.java | 9 ++++++-- 3 files changed, 19 insertions(+), 25 deletions(-) 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 390fd8aab..486f03874 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 @@ -1,31 +1,30 @@ package com.dfsek.terra.api.event.events.config; import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.config.pack.ConfigPack; -import java.util.ArrayList; -import java.util.List; - /** * 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 { - public ConfigPackPreLoadEvent(ConfigPack pack) { + private final ExceptionalConsumer configLoader; + + public ConfigPackPreLoadEvent(ConfigPack pack, ExceptionalConsumer configLoader) { super(pack); + this.configLoader = configLoader; } - private final List templates = new ArrayList<>(); - /** - * Add an additional config template to load using the pack manifest. + * Load a custom {@link ConfigTemplate} using the pack manifest. * * @param template Template to register. */ - public void addTemplate(ConfigTemplate template) { - templates.add(template); + public void loadTemplate(ConfigTemplate template) throws ConfigException { + configLoader.accept(template); } - public List getTemplates() { - return new ArrayList<>(templates); + public interface ExceptionalConsumer { + void accept(T value) throws ConfigException; } } 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 737c76412..b10de2b0e 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 @@ -2,7 +2,6 @@ package com.dfsek.terra.config.pack; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; @@ -137,11 +136,7 @@ public class ConfigPack implements LoaderRegistrar { main.logger().info("Loading config pack \"" + template.getID() + "\""); - ConfigPackPreLoadEvent event = new ConfigPackPreLoadEvent(this); - main.getEventManager().callEvent(event); - for(ConfigTemplate eventTemplate : event.getTemplates()) { - selfLoader.load(eventTemplate, configuration); - } + main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this, template -> selfLoader.load(template, configuration))); load(l, main); @@ -188,12 +183,7 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(template, configuration); main.logger().info("Loading config pack \"" + template.getID() + "\""); - ConfigPackPreLoadEvent event = new ConfigPackPreLoadEvent(this); - main.getEventManager().callEvent(event); - for(ConfigTemplate eventTemplate : event.getTemplates()) { - selfLoader.load(eventTemplate, configuration); - } - + main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this, template -> selfLoader.load(template, configuration))); load(l, main); 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 b56ae4d5c..e6168a455 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.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.TerraPlugin; @@ -329,7 +330,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }; //noinspection ConstantConditions ((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID())); - GeneratorTypeAccessor.getValues().add(generatorType); + GeneratorTypeAccessor.getValues().add(1, generatorType); }); } @@ -475,7 +476,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI); PackFeatureOptionsTemplate template = new PackFeatureOptionsTemplate(); - event.addTemplate(template); + try { + event.loadTemplate(template); + } catch(ConfigException e) { + e.printStackTrace(); + } templates.put(event.getPack(), template); } From cf66e1e226781a53302cc6cf222bc5c6d99c8eb4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:53:25 -0700 Subject: [PATCH 05/28] registry injection --- .../com/dfsek/terra/fabric/TerraFabricPlugin.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 e6168a455..0d80eafe7 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 @@ -481,6 +481,18 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } catch(ConfigException e) { e.printStackTrace(); } + + if(template.doRegistryInjection()) { + BuiltinRegistries.CONFIGURED_FEATURE.getEntries().forEach(entry -> { + if(!template.getExcludedRegistryFeatures().contains(entry.getKey().getValue())) { + try { + event.getPack().getTreeRegistry().add(entry.getKey().getValue().toString(), (Tree) entry.getValue()); + main.logger().info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); + } catch(DuplicateEntryException ignored) { + } + } + }); + } templates.put(event.getPack(), template); } From cac84ffe03bbdedb49744d6c28fc5fd6c3b24eb5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 00:55:14 -0700 Subject: [PATCH 06/28] fix typo --- .../dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 86956e686..a6e359fd0 100644 --- 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 @@ -21,7 +21,7 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate { @Default private List excludedRegistryFeatures = new ArrayList<>(); - @Value("features.inject-biome.excluded-features") + @Value("features.inject-registry.excluded-features") @Default private List excludedBiomeFeatures = new ArrayList<>(); From 4c7aa11353c26d3778e716fb4164dd015c0f5c42 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 08:39:43 -0700 Subject: [PATCH 07/28] clean up TerraFabricPlugin --- .../com/dfsek/terra/fabric/FabricUtil.java | 148 ++++++++++++++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 138 +--------------- .../fabric/generation/TerraBiomeSource.java | 3 +- 3 files changed, 153 insertions(+), 136 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java new file mode 100644 index 000000000..f88beec7d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java @@ -0,0 +1,148 @@ +package com.dfsek.terra.fabric; + +import com.dfsek.terra.api.command.CommandManager; +import com.dfsek.terra.api.command.exception.CommandException; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Entity; +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.config.PackFeatureOptionsTemplate; +import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; +import net.minecraft.block.Blocks; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.LiteralText; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; +import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; + +import java.util.ArrayList; +import java.util.Arrays; +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; + +public final class FabricUtil { + public static String createBiomeID(ConfigPack pack, String biomeID) { + return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); + } + + protected static void registerCommands(CommandManager manager) { + CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { + int max = manager.getMaxArgumentDepth(); + RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); + for(int i = 0; i < max; i++) { + RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); + + arg = next.then(FabricUtil.assemble(arg, manager)); + } + + dispatcher.register(literal("terra").executes(context -> 1).then(FabricUtil.assemble(arg, manager))); + dispatcher.register(literal("te").executes(context -> 1).then(FabricUtil.assemble(arg, manager))); + //dispatcher.register(literal("te").redirect(root)); + } + ); + } + + private static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { + return in.suggests((context, builder) -> { + List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); + try { + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } + try { + manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); + } catch(CommandException e) { + sender.sendMessage(e.getMessage()); + } + return builder.buildFuture(); + }).executes(context -> { + List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); + try { + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } + try { + manager.execute(args.remove(0), sender, args); + } catch(CommandException e) { + context.getSource().sendError(new LiteralText(e.getMessage())); + } + return 1; + }); + } + + private static List parseCommand(String command) { + if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); + else if(command.startsWith("/te ")) command = command.substring("/te ".length()); + List c = new ArrayList<>(Arrays.asList(command.split(" "))); + if(command.endsWith(" ")) c.add(""); + return c; + } + + static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack) { + BiomeTemplate template = biome.getTemplate(); + Map colors = template.getColors(); + + Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + + GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + 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, TerraFabricPlugin.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() + .waterColor(colors.getOrDefault("water", accessor.getWaterColor())) + .waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor())) + .fogColor(colors.getOrDefault("fog", accessor.getFogColor())) + .skyColor(colors.getOrDefault("sky", accessor.getSkyColor())) + .grassColorModifier(accessor.getGrassColorModifier()); + + if(colors.containsKey("grass")) { + effects.grassColor(colors.get("grass")); + } else { + accessor.getGrassColor().ifPresent(effects::grassColor); + } + if(colors.containsKey("foliage")) { + effects.foliageColor(colors.get("foliage")); + } else { + accessor.getFoliageColor().ifPresent(effects::foliageColor); + } + + return new Biome.Builder() + .precipitation(vanilla.getPrecipitation()) + .category(vanilla.getCategory()) + .depth(vanilla.getDepth()) + .scale(vanilla.getScale()) + .temperature(vanilla.getTemperature()) + .downfall(vanilla.getDownfall()) + .effects(effects.build()) + .spawnSettings(vanilla.getSpawnSettings()) + .generationSettings(generationSettings.build()) + .build(); + } +} 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 0d80eafe7..5ada9126b 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 @@ -10,7 +10,6 @@ import com.dfsek.terra.api.addons.annotations.Author; import com.dfsek.terra.api.addons.annotations.Version; import com.dfsek.terra.api.command.CommandManager; import com.dfsek.terra.api.command.TerraCommandManager; -import com.dfsek.terra.api.command.exception.CommandException; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventManager; @@ -18,9 +17,7 @@ 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.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.entity.Entity; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; @@ -34,18 +31,15 @@ import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; -import com.dfsek.terra.config.builder.BiomeBuilder; 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; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; -import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; @@ -53,25 +47,16 @@ import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Blocks; import net.minecraft.client.world.GeneratorType; -import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.LiteralText; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.decorator.Decorator; @@ -80,24 +65,14 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredFeatures; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; 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; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @@ -150,10 +125,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return instance; } - public static String createBiomeID(ConfigPack pack, String biomeID) { - return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); - } - @Override public WorldHandle getWorldHandle() { return worldHandle; @@ -262,63 +233,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } - private Biome createBiome(BiomeBuilder biome, ConfigPack pack) { - BiomeTemplate template = biome.getTemplate(); - Map colors = template.getColors(); - - Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); - - GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); - 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() - .waterColor(colors.getOrDefault("water", accessor.getWaterColor())) - .waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor())) - .fogColor(colors.getOrDefault("fog", accessor.getFogColor())) - .skyColor(colors.getOrDefault("sky", accessor.getSkyColor())) - .grassColorModifier(accessor.getGrassColorModifier()); - - if(colors.containsKey("grass")) { - effects.grassColor(colors.get("grass")); - } else { - accessor.getGrassColor().ifPresent(effects::grassColor); - } - if(colors.containsKey("foliage")) { - effects.foliageColor(colors.get("foliage")); - } else { - accessor.getFoliageColor().ifPresent(effects::foliageColor); - } - - return new Biome.Builder() - .precipitation(vanilla.getPrecipitation()) - .category(vanilla.getCategory()) - .depth(vanilla.getDepth()) - .scale(vanilla.getScale()) - .temperature(vanilla.getTemperature()) - .downfall(vanilla.getDownfall()) - .effects(effects.build()) - .spawnSettings(vanilla.getSpawnSettings()) - .generationSettings(generationSettings.build()) - .build(); - } - public void packInit() { 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, pack)))); // Register all Terra biomes. + registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(fabricAddon, biome, pack)))); // Register all Terra biomes. if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { registry.forEach(pack -> { @@ -366,62 +285,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } catch(MalformedCommandException e) { e.printStackTrace(); // TODO do something here even though this should literally never happen } + FabricUtil.registerCommands(manager); - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { - int max = manager.getMaxArgumentDepth(); - RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); - for(int i = 0; i < max; i++) { - RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - - arg = next.then(assemble(arg, manager)); - } - - dispatcher.register(literal("terra").executes(context -> 1).then(assemble(arg, manager))); - dispatcher.register(literal("te").executes(context -> 1).then(assemble(arg, manager))); - //dispatcher.register(literal("te").redirect(root)); - } - ); logger.info("Finished initialization."); } - private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { - return in.suggests((context, builder) -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); - } catch(CommandException e) { - sender.sendMessage(e.getMessage()); - } - return builder.buildFuture(); - }).executes(context -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.execute(args.remove(0), sender, args); - } catch(CommandException e) { - context.getSource().sendError(new LiteralText(e.getMessage())); - } - return 1; - }); - } - - private List parseCommand(String command) { - if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); - else if(command.startsWith("/te ")) command = command.substring("/te ".length()); - List c = new ArrayList<>(Arrays.asList(command.split(" "))); - if(command.endsWith(" ")) c.add(""); - return c; - } - @Override public EventManager getEventManager() { @@ -436,7 +304,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") - private static final class FabricAddon extends TerraAddon implements EventListener { + static final class FabricAddon extends TerraAddon implements EventListener { private final TerraPlugin main; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index e2d821192..d0fdfbdcc 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -3,6 +3,7 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.fabric.FabricUtil; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -51,7 +52,7 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX << 2, biomeZ << 2); - return biomeRegistry.get(new Identifier("terra", TerraFabricPlugin.createBiomeID(pack, biome.getID()))); + return biomeRegistry.get(new Identifier("terra", FabricUtil.createBiomeID(pack, biome.getID()))); } From 242e56b1d8b800e938f7f1b4b6025bd0aa9cd389 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 12 May 2021 09:27:20 -0700 Subject: [PATCH 08/28] conditional biome injection --- .../java/com/dfsek/terra/fabric/FabricUtil.java | 7 ++++++- .../config/PackFeatureOptionsTemplate.java | 16 +++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java index f88beec7d..209a951e8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java @@ -16,6 +16,8 @@ import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.minecraft.block.Blocks; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.LiteralText; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; @@ -109,7 +111,10 @@ public final class FabricUtil { 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); + Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get()); + if(!optionsTemplate.getExcludedBiomeFeatures().contains(key)) { + generationSettings.feature(step, featureSupplier); + } } } } 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 index a6e359fd0..998fd25a0 100644 --- 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 @@ -6,7 +6,9 @@ import com.dfsek.tectonic.config.ConfigTemplate; import net.minecraft.util.Identifier; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class PackFeatureOptionsTemplate implements ConfigTemplate { @Value("features.inject-registry.enable") @@ -17,13 +19,13 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate { @Default private boolean doBiomeInjection = false; - @Value("features.inject-biome.excluded-features") - @Default - private List excludedRegistryFeatures = new ArrayList<>(); - @Value("features.inject-registry.excluded-features") @Default - private List excludedBiomeFeatures = new ArrayList<>(); + private Set excludedRegistryFeatures = new HashSet<>(); + + @Value("features.inject-biome.excluded-features") + @Default + private Set excludedBiomeFeatures = new HashSet<>(); public boolean doBiomeInjection() { return doBiomeInjection; @@ -33,11 +35,11 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate { return doRegistryInjection; } - public List getExcludedBiomeFeatures() { + public Set getExcludedBiomeFeatures() { return excludedBiomeFeatures; } - public List getExcludedRegistryFeatures() { + public Set getExcludedRegistryFeatures() { return excludedRegistryFeatures; } } From 95d50a03910ce6c26fc2ff8d33717313fc28a425 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 16 May 2021 00:35:36 -0700 Subject: [PATCH 09/28] resolve merge conflicts --- .../com/dfsek/terra/fabric/FabricUtil.java | 22 ------------------- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 ---- 2 files changed, 26 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java index 209a951e8..7d245f65c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java @@ -9,10 +9,8 @@ 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.mixin.access.BiomeEffectsAccessor; -import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.minecraft.block.Blocks; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.LiteralText; @@ -33,31 +31,11 @@ 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; - public final class FabricUtil { public static String createBiomeID(ConfigPack pack, String biomeID) { return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } - protected static void registerCommands(CommandManager manager) { - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { - int max = manager.getMaxArgumentDepth(); - RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); - for(int i = 0; i < max; i++) { - RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - - arg = next.then(FabricUtil.assemble(arg, manager)); - } - - dispatcher.register(literal("terra").executes(context -> 1).then(FabricUtil.assemble(arg, manager))); - dispatcher.register(literal("te").executes(context -> 1).then(FabricUtil.assemble(arg, manager))); - //dispatcher.register(literal("te").redirect(root)); - } - ); - } - private static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { return in.suggests((context, builder) -> { List args = parseCommand(context.getInput()); 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 b031cc56f..5ba23cee3 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 @@ -71,9 +71,7 @@ import org.apache.logging.log4j.LogManager; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Locale; import java.util.Map; @@ -292,8 +290,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } catch(MalformedCommandException e) { e.printStackTrace(); // TODO do something here even though this should literally never happen } - FabricUtil.registerCommands(manager); - logger.info("Finished initialization."); } From 800d846af4b5a034c514b8019b016dc8b6c24282 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 16 May 2021 16:47:17 -0700 Subject: [PATCH 10/28] carver and structure compatibility options --- .../com/dfsek/terra/fabric/FabricUtil.java | 77 ++++++------------- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 +- .../fabric/mixin/CommandManagerMixin.java | 2 +- 3 files changed, 27 insertions(+), 56 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java index 7d245f65c..de8afe407 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java @@ -1,32 +1,21 @@ package com.dfsek.terra.fabric; -import com.dfsek.terra.api.command.CommandManager; -import com.dfsek.terra.api.command.exception.CommandException; -import com.dfsek.terra.api.platform.CommandSender; -import com.dfsek.terra.api.platform.entity.Entity; 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.config.PackFeatureOptionsTemplate; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.block.Blocks; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.LiteralText; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.carver.ConfiguredCarver; import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.function.Supplier; @@ -36,54 +25,36 @@ public final class FabricUtil { return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } - private static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { - return in.suggests((context, builder) -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); - } catch(CommandException e) { - sender.sendMessage(e.getMessage()); - } - return builder.buildFuture(); - }).executes(context -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.execute(args.remove(0), sender, args); - } catch(CommandException e) { - context.getSource().sendError(new LiteralText(e.getMessage())); - } - return 1; - }); - } - - private static List parseCommand(String command) { - if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); - else if(command.startsWith("/te ")) command = command.substring("/te ".length()); - List c = new ArrayList<>(Arrays.asList(command.split(" "))); - if(command.endsWith(" ")) c.add(""); - return c; - } - - static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack) { + /** + * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. + * + * @param fabricAddon The Fabric addon instance. + * @param biome The Terra BiomeBuilder. + * @param pack The ConfigPack this biome belongs to. + * @return The Minecraft delegate biome. + */ + public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); - 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.surfaceBuilder(vanilla.getGenerationSettings().getSurfaceBuilder()); // It needs a surfacebuilder, even though we dont use it. + generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, TerraFabricPlugin.POPULATOR_CONFIGURED_FEATURE); + for(GenerationStep.Carver carver : GenerationStep.Carver.values()) { + for(Supplier> configuredCarverSupplier : vanilla.getGenerationSettings().getCarversForStep(carver)) { + generationSettings.carver(carver, configuredCarverSupplier.get()); + } + } + + for(Supplier> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { + generationSettings.structureFeature(structureFeature.get()); + } + PackFeatureOptionsTemplate optionsTemplate = fabricAddon.getTemplates().get(pack); if(optionsTemplate.doBiomeInjection()) { 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 5ba23cee3..a884a6089 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 @@ -278,8 +278,8 @@ 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(Registry.FEATURE, new Identifier("terra", "populator"), POPULATOR_FEATURE); + RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "populator")); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java index 13b15d7ce..2e98614df 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java @@ -31,7 +31,7 @@ public abstract class CommandManagerMixin { @Final private CommandDispatcher dispatcher; - @Inject(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/CommandDispatcher;findAmbiguities(Lcom/mojang/brigadier/AmbiguityConsumer;)V")) + @Inject(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/CommandDispatcher;findAmbiguities(Lcom/mojang/brigadier/AmbiguityConsumer;)V", remap = false)) private void injectTerraCommands(CommandManager.RegistrationEnvironment environment, CallbackInfo ci) { com.dfsek.terra.api.command.CommandManager manager = TerraFabricPlugin.getInstance().getManager(); int max = manager.getMaxArgumentDepth(); From 8844cd5069143d8dda57228a3a645f9b19582de8 Mon Sep 17 00:00:00 2001 From: Shadowhacker Date: Mon, 17 May 2021 03:53:07 +0200 Subject: [PATCH 11/28] Creating new locale for Czech I've created a new localization file for Czech language --- common/src/main/resources/lang/cs_cz.yml | 122 +++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 common/src/main/resources/lang/cs_cz.yml diff --git a/common/src/main/resources/lang/cs_cz.yml b/common/src/main/resources/lang/cs_cz.yml new file mode 100644 index 000000000..c01c6fcf9 --- /dev/null +++ b/common/src/main/resources/lang/cs_cz.yml @@ -0,0 +1,122 @@ +enable: + - "Pokud se vám líbí Terra, můžete nás podpořit na Patreon!" + - "Získáte přístup k experimentálním funkcím, než budou vydány!" + - "Podpořit projekt můžete zde: https://www.patreon.com/dfsek" +disable: + - "Děkujeme, že používáte Terra!" +command: + debug-only: "Tento příkaz musí být použit se zapnutým debug modem!" + player-only: "Tento příkaz je pouze pro hráče!" + invalid: "Neznámý příkaz. (Očekáváno %1$s argumentů, nalezeno %2$s)." + players-only: "Příkaz je pouze pro použití hráčem." + world: "Tento příkaz musí být použit v Terra světě!" + reload: "Obnoven Terra konfig." + reload-error: "Nastaly chyby při obnově Terra konfigurace. Podívejte se do logů pro více informací." + version: "Na tomto serveru běží Terra verze \"%1$s\", na platformě \"%2$s\"" + main-menu: + - "--------------------Terra--------------------" + - "reload - Obnoví konfigurační data" + - "biome - Ukáže aktuální biom" + - "ore - Generuje žílu rud v lokaci, ve směru kam se koukáte (Pro debugging)" + - "save-data - Uložit populační data" + - "structure - Nahrát a exportovat struktury" + - "profile - Profiler možnosti" + - "image - Obrázek/GUI možnosti" + biome: + biome-found: "Lokalizován biom na (%1$s, %2$s)" + unable-to-locate: "Nelze lokalizovat biom." + invalid-radius: "Nesprávný radius: \"%s\"" + invalid: "Nesprávné ID bomu: \"%s\"" + in: "Jste v \"%s\"" + packs: + main: "Aktuální instalované konfigurační balíčky:" + pack: " - %1$s v%3$s od %2$s" + none: "Žádné konfigurační balíčky nejsou nainstalovány." + ore: + main-menu: + - "---------------Terra/ore---------------" + - "Generuje žílu rud na bloku, na který koukáte." + out-of-range: "Blok mimo dosah" + invalid-ore: "Nelze nalézt Rudu \"%s\"" + geometry: + main-menu: + - "---------------Terra/geometry----------------" + - "Různé voxel geometrické debugging příkazy" + - "sphere - Generuje kouli" + - "deformsphere - Generuje deformovanou kouli" + - "tube - Generuje válec" + deform: + invalid-radius: "Nesprávný radius: \"%s\"" + invalid-deform: "Nesprávná deformace: \"%s\"" + invalid-frequency: "Nesprávná frekvence: \"%s\"" + sphere: + invalid-radius: "Nesprávný radius: \"%s\"" + tube: + invalid-radius: "Nesprávný radius: \"%s\"" + image: + main-menu: + - "---------------Terra/image---------------" + - "render - Vykreslí obrázek s danou šířkou a výškou, který může být později importován jako svět." + - "gui - Otevřít debug GUI (Musí být zapnuto v konfigu)" + gui: + main-menu: + - "-------------Terra/image/gui-------------" + - "raw - Otevře GUI s raw Biom daty" + - "step - Znovu vykreslí data k lepšímu zobrazení borderu" + debug: "Debug mod musí být zapnutý pro použití této možnosti! Debug GUI NENÍ PRODUKČNĚ BEZPEČNÉ!" + render: + save: "Uložen obrázek jako \"%s\"" + error: "Nastala chyba při generování obrázku!" + profile: + main-menu: + - "---------------Terra/profile---------------" + - "start - Zapne profiler" + - "stop - Vypne profiler" + - "query - Ukáže profiler data" + - "reset - Resetuje profiler data" + reset: "Profiler byl resetován." + start: "Profiler byl zapnut." + stop: "Profiler byl vypnut." + structure: + main-menu: + - "---------------Terra/structure---------------" + - "export - Export vašeho výběru WorldEdit jako Terra struktura." + - "load - Načíst Terra strukturu" + invalid-radius: "Nesprávný radius: \"%s\"" + invalid-rotation: "Nesprávná rotace: \"%s\"" + invalid: "Nesprávné ID struktury: \"%s\"" + export: "Uložena struktura do \"%s\"" +world-config: + load: "Načteny konfigurační hodnoty světa pro svět \"%s\"..." + not-found: "Konfigurace pro svět \"%s\" nenalezena. Kopíruji defaultní konfig." + using-image: "Načítám svět z obrázku." + error: "Nelze načíst konfigurace pro svět %s" + done: "Načítání světa \"%1$s\" dokončeno. Uplynulý čas: %2$sms" +config-pack: + loaded: "Konfigurační balíček %1$s v%4$s od %3$s byl načten za %2$sms." +config: + loaded: "Načten %1$s ze souboru %2$s" + loaded-all: "Načteno %1$s %2$s(s) za %3$sms." + error: + invalid-failover: "Nesprávný typ failover: \"%s\"" + duplicate: "Duplikační ID nalezeno v souboru: %s" + file: + - "Konfigurační chyba pro Terra objekt. Soubor: %1$s" + - "%2$s" + - "Opravte jej před pokračováním!" + generic: + - "Nastala chyba při načítání konfigurace." + - "Prosíme nahlašte to na Terra." +warning: + no-population: "Žádné populační chunky nebyly načteny. Pokud je to poprvé, co zapínáte server s Terra, či vytváříte nový svět, je tohle normální." +error: + severe-config: "Vážná konfigurační chyba zabránila Terra ze správné generace terénu na koordinátech: %1$s, %2$s. Prosíme zkontrolujte konfiguraci pro chyby. Jakékoli konfigurační chyby jsou vypsány výše." +debug: + data-save : "Uložena populační data." +use-paper: + - "Vypadá to, že používáte Spigot/CraftBukkit." + - "Ačkoli Terra &ofunguje&r na Spigot, některé funkce budou ztraceny. (Terra je netestována na CraftBukkit; žádná podpora nebude dána pro CraftBukkit)." + - "Pro nejvíce funkcí s Terra, použijte Paper." + - "Navíc, Paper přináší obrovské výkonnostní zlepešení než Spigot, a všechny Spigot pluginy by měli fungovat s Paper!" + - "Pro nejlepší zážitek s Terra a všemi pluginy, použijte prosím Paper." + - "Více info najdete na stránce Paperu: https://papermc.io/" From f96740f1fa52b242e2b3a933769c7ca694dd82c3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 08:38:03 -0700 Subject: [PATCH 12/28] refactor util classes --- .../main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 3 ++- .../dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java | 3 +-- .../com/dfsek/terra/fabric/generation/TerraBiomeSource.java | 2 +- .../java/com/dfsek/terra/fabric/{ => util}/FabricUtil.java | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{ => util}/FabricUtil.java (98%) 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 a884a6089..3573e8427 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 @@ -41,6 +41,7 @@ import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -308,7 +309,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") - static final class FabricAddon extends TerraAddon implements EventListener { + public static final class FabricAddon extends TerraAddon implements EventListener { private final TerraPlugin main; 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 index 998fd25a0..48e1c9cb9 100644 --- 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 @@ -5,11 +5,10 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import net.minecraft.util.Identifier; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; +@SuppressWarnings("FieldMayBeFinal") public class PackFeatureOptionsTemplate implements ConfigTemplate { @Value("features.inject-registry.enable") @Default diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index d0fdfbdcc..a124ebada 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.fabric.FabricUtil; +import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index de8afe407..224f616ba 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.fabric; +package com.dfsek.terra.fabric.util; 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.PackFeatureOptionsTemplate; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import net.minecraft.util.Identifier; From 41a54f4b2542a0c7967a9fc258a3736563d3f458 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 10:07:06 -0700 Subject: [PATCH 13/28] vanilla structures --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- .../FabricChunkGeneratorWrapper.java | 32 ++++++++++--------- .../dfsek/terra/fabric/util/FabricUtil.java | 2 ++ 3 files changed, 20 insertions(+), 16 deletions(-) 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 3573e8427..f5c5eb156 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 @@ -168,7 +168,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public boolean isDebug() { - return true; + return config.isDebug(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index b4efa496e..116c007ad 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -90,23 +90,24 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Nullable @Override public BlockPos locateStructure(ServerWorld world, StructureFeature feature, BlockPos center, int radius, boolean skipExistingChunks) { - String name = Objects.requireNonNull(Registry.STRUCTURE_FEATURE.getId(feature)).toString(); - TerraWorld terraWorld = TerraFabricPlugin.getInstance().getWorld((World) world); - TerraStructure located = pack.getStructure(pack.getTemplate().getLocatable().get(name)); - if(located != null) { - CompletableFuture result = new CompletableFuture<>(); - AsyncStructureFinder finder = new AsyncStructureFinder(terraWorld.getBiomeProvider(), located, FabricAdapter.adapt(center).toLocation((World) world), 0, 500, location -> { - result.complete(FabricAdapter.adapt(location)); - }, TerraFabricPlugin.getInstance()); - finder.run(); // Do this synchronously. - try { - return result.get(); - } catch(InterruptedException | ExecutionException e) { - throw new RuntimeException(e); + if(!pack.getTemplate().disableStructures()) { + String name = Objects.requireNonNull(Registry.STRUCTURE_FEATURE.getId(feature)).toString(); + TerraWorld terraWorld = TerraFabricPlugin.getInstance().getWorld((World) world); + TerraStructure located = pack.getStructure(pack.getTemplate().getLocatable().get(name)); + if(located != null) { + CompletableFuture result = new CompletableFuture<>(); + AsyncStructureFinder finder = new AsyncStructureFinder(terraWorld.getBiomeProvider(), located, FabricAdapter.adapt(center).toLocation((World) world), 0, 500, location -> { + result.complete(FabricAdapter.adapt(location)); + }, TerraFabricPlugin.getInstance()); + finder.run(); // Do this synchronously. + try { + return result.get(); + } catch(InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } } } - TerraFabricPlugin.getInstance().logger().warning("No overrides are defined for \"" + name + "\""); - return null; + return super.locateStructure(world, feature, center, radius, skipExistingChunks); } @Override @@ -127,6 +128,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public boolean isStrongholdStartingChunk(ChunkPos chunkPos) { + if(pack.getTemplate().vanillaStructures()) return super.isStrongholdStartingChunk(chunkPos); return false; } 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 224f616ba..72c8404c6 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 @@ -59,11 +59,13 @@ public final class FabricUtil { PackFeatureOptionsTemplate optionsTemplate = fabricAddon.getTemplates().get(pack); if(optionsTemplate.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(!optionsTemplate.getExcludedBiomeFeatures().contains(key)) { generationSettings.feature(step, featureSupplier); + TerraFabricPlugin.getInstance().getDebugLogger().info("Injected " + key + " at stage " + step); } } } From ce7033b4cabb74927e6209a48fb99c04cf29f37b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 10:07:22 -0700 Subject: [PATCH 14/28] filter out non-Terra biomes in TerraBiomeSource --- .../dfsek/terra/fabric/generation/TerraBiomeSource.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index a124ebada..a85dcd89d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -14,6 +14,7 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.feature.StructureFeature; +import java.util.Objects; import java.util.stream.Collectors; public class TerraBiomeSource extends BiomeSource { @@ -32,7 +33,9 @@ public class TerraBiomeSource extends BiomeSource { private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { - super(biomes.stream().collect(Collectors.toList())); + super(biomes.stream() + .filter(biome -> Objects.requireNonNull(biomes.getId(biome)).getNamespace().equals("terra")) // Filter out non-Terra biomes. + .collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; this.grid = pack.getBiomeProviderBuilder().build(seed); @@ -60,6 +63,4 @@ public class TerraBiomeSource extends BiomeSource { public boolean hasStructureFeature(StructureFeature feature) { return false; } - - } From 4aa20c32b8b3bd1af389bb6fbaa1e9147ba59edd Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 17:35:56 -0700 Subject: [PATCH 15/28] fix fabric debuglogger --- .../com/dfsek/terra/fabric/TerraFabricPlugin.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 f5c5eb156..5ef1e94e0 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 @@ -77,7 +77,7 @@ import java.util.Map; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { - + private final org.apache.logging.log4j.Logger log4jLogger = LogManager.getLogger(); public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(DefaultFeatureConfig.CODEC); public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); private static TerraFabricPlugin instance; @@ -88,21 +88,19 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Profiler profiler = new ProfilerImpl(); private final Logger logger = new Logger() { - private final org.apache.logging.log4j.Logger logger = LogManager.getLogger(); - @Override public void info(String message) { - logger.info(message); + log4jLogger.info(message); } @Override public void warning(String message) { - logger.warn(message); + log4jLogger.warn(message); } @Override public void severe(String message) { - logger.error(message); + log4jLogger.error(message); } }; @@ -270,6 +268,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { this.dataFolder = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); saveDefaultConfig(); config.load(this); + debugLogger.setDebug(config.isDebug()); LangUtil.load(config.getLanguage(), this); logger.info("Initializing Terra..."); From a549d2ef3484ace9f1f94d9ec00be71dbd09ee27 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 19:26:25 -0700 Subject: [PATCH 16/28] move client init code to MinecraftClientMixin --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 20 ----------------- .../fabric/generation/TerraGeneratorType.java | 22 +++++++++++++++++++ .../mixin/init/MinecraftClientMixin.java | 10 +++++++++ 3 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.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 5ef1e94e0..089bd6b63 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 @@ -40,7 +40,6 @@ import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; -import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; @@ -48,18 +47,13 @@ import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; -import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.world.GeneratorType; -import net.minecraft.text.LiteralText; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -244,20 +238,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(fabricAddon, biome, pack)))); // Register all Terra biomes. - if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - registry.forEach(pack -> { - final GeneratorType generatorType = new GeneratorType("terra." + pack.getTemplate().getID()) { - @Override - protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); - } - }; - //noinspection ConstantConditions - ((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID())); - GeneratorTypeAccessor.getValues().add(1, generatorType); - }); - } - logger.info("Loaded packs."); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java new file mode 100644 index 000000000..6ae8dac89 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.fabric.generation; + +import com.dfsek.terra.config.pack.ConfigPack; +import net.minecraft.client.world.GeneratorType; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; + +public class TerraGeneratorType extends GeneratorType { + private final ConfigPack pack; + + public TerraGeneratorType(ConfigPack pack) { + super("terra." + pack.getTemplate().getID()); + this.pack = pack; + } + + @Override + protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java index 4da836a97..59dba3484 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java @@ -1,8 +1,12 @@ package com.dfsek.terra.fabric.mixin.init; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.generation.TerraGeneratorType; +import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; +import net.minecraft.client.world.GeneratorType; +import net.minecraft.text.LiteralText; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,5 +19,11 @@ public class MinecraftClientMixin { shift = At.Shift.BEFORE)) public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftClient construction, after other mods have registered blocks and stuff + TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> { + final GeneratorType generatorType = new TerraGeneratorType(pack); + //noinspection ConstantConditions + ((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID())); + GeneratorTypeAccessor.getValues().add(1, generatorType); + }); } } From c0042cfb6b959e0064772d17541da4a3495b48f3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 19:39:46 -0700 Subject: [PATCH 17/28] switch to DimensionType map --- .../com/dfsek/terra/fabric/TerraFabricPlugin.java | 14 ++++++++------ .../generation/FabricChunkGeneratorWrapper.java | 6 ++++-- 2 files changed, 12 insertions(+), 8 deletions(-) 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 089bd6b63..673b4c973 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 @@ -53,7 +53,9 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -75,7 +77,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(DefaultFeatureConfig.CODEC); public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); private static TerraFabricPlugin instance; - private final Map worldMap = new HashMap<>(); + private final Map worldMap = new HashMap<>(); private final EventManager eventManager = new TerraEventManager(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); @@ -131,15 +133,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public TerraWorld getWorld(World world) { - return worldMap.computeIfAbsent(world.getSeed(), w -> { + return worldMap.computeIfAbsent(((WorldAccess) world).getDimension(), w -> { logger.info("Loading world " + w); return new TerraWorld(world, ((FabricChunkGeneratorWrapper) world.getGenerator()).getPack(), this); }); } - public TerraWorld getWorld(long seed) { - TerraWorld world = worldMap.get(seed); - if(world == null) throw new IllegalArgumentException("No world exists with seed " + seed); + public TerraWorld getWorld(DimensionType type) { + TerraWorld world = worldMap.get(type); + if(world == null) throw new IllegalArgumentException("No world exists with dimension type " + type); return world; } @@ -183,7 +185,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { config.load(this); LangUtil.load(config.getLanguage(), this); // Load language. boolean succeed = registry.loadAll(this); - Map newMap = new HashMap<>(); + Map newMap = new HashMap<>(); worldMap.forEach((seed, tw) -> { tw.getConfig().getSamplerCache().clear(); String packID = tw.getConfig().getTemplate().getID(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 116c007ad..fb91046a1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -11,11 +11,9 @@ import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; -import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.population.items.TerraStructure; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.server.world.ServerWorld; @@ -134,6 +132,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public int getHeight(int x, int z, Heightmap.Type heightmapType) { + /* TerraWorld world = TerraFabricPlugin.getInstance().getWorld(seed); Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)); int cx = FastMath.floorMod(x, 16); @@ -146,6 +145,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } return height; + + */ + return 0; } @Override From 2626afd06611d5a06632d41592626ce17223109a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 19:41:18 -0700 Subject: [PATCH 18/28] override entity generation --- .../generation/FabricChunkGeneratorWrapper.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index fb91046a1..f130ceb42 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -25,9 +25,12 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.BlockView; import net.minecraft.world.ChunkRegion; import net.minecraft.world.Heightmap; +import net.minecraft.world.SpawnHelper; import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.ChunkRandom; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -169,6 +172,18 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return new VerticalBlockSample(array); } + @Override + public void populateEntities(ChunkRegion region) { + if(pack.getTemplate().vanillaMobs()) { + int cx = region.getCenterChunkX(); + int cy = region.getCenterChunkZ(); + Biome biome = region.getBiome((new ChunkPos(cx, cy)).getStartPos()); + ChunkRandom chunkRandom = new ChunkRandom(); + chunkRandom.setPopulationSeed(region.getSeed(), cx << 4, cy << 4); + SpawnHelper.populateEntities(region, biome, cx, cy, chunkRandom); + } + } + @Override public TerraChunkGenerator getHandle() { return delegate; From ae76fb7dc452601c91fd4b0b919a5b2d63d0ae68 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 20:16:32 -0700 Subject: [PATCH 19/28] use dimensiontype to get world --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 27 ++++++++------- .../terra/fabric/mixin/ServerWorldMixin.java | 34 +++++++++++++++++++ .../src/main/resources/terra.mixins.json | 1 + 3 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.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 673b4c973..e70532142 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 @@ -26,6 +26,7 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.transform.Validator; +import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.commands.CommandUtil; @@ -49,6 +50,7 @@ import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; @@ -77,7 +79,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(DefaultFeatureConfig.CODEC); public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); private static TerraFabricPlugin instance; - private final Map worldMap = new HashMap<>(); + private final Map> worldMap = new HashMap<>(); + + public Map> getWorldMap() { + return worldMap; + } + private final EventManager eventManager = new TerraEventManager(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); @@ -133,14 +140,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public TerraWorld getWorld(World world) { - return worldMap.computeIfAbsent(((WorldAccess) world).getDimension(), w -> { - logger.info("Loading world " + w); - return new TerraWorld(world, ((FabricChunkGeneratorWrapper) world.getGenerator()).getPack(), this); - }); + return getWorld(((WorldAccess) world).getDimension()); } public TerraWorld getWorld(DimensionType type) { - TerraWorld world = worldMap.get(type); + TerraWorld world = worldMap.get(type).getRight(); if(world == null) throw new IllegalArgumentException("No world exists with dimension type " + type); return world; } @@ -185,14 +189,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { config.load(this); LangUtil.load(config.getLanguage(), this); // Load language. boolean succeed = registry.loadAll(this); - Map newMap = new HashMap<>(); - worldMap.forEach((seed, tw) -> { - tw.getConfig().getSamplerCache().clear(); - String packID = tw.getConfig().getTemplate().getID(); - newMap.put(seed, new TerraWorld(tw.getWorld(), registry.get(packID), this)); + worldMap.forEach((seed, pair) -> { + pair.getRight().getConfig().getSamplerCache().clear(); + String packID = pair.getRight().getConfig().getTemplate().getID(); + pair.setRight(new TerraWorld(pair.getRight().getWorld(), registry.get(packID), this)); }); - worldMap.clear(); - worldMap.putAll(newMap); return succeed; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java new file mode 100644 index 000000000..e84407ccf --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.fabric.mixin; + +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.world.TerraWorld; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListener; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.Spawner; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.LevelStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; +import java.util.concurrent.Executor; + +@Mixin(ServerWorld.class) +public abstract class ServerWorldMixin { + @Inject(method = "", at = @At(value = "RETURN")) + public void injectConstructor(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo ci) { + if(chunkGenerator instanceof FabricChunkGeneratorWrapper) { + TerraFabricPlugin.getInstance().getWorldMap().put(dimensionType, Pair.of((ServerWorld) (Object) this, new TerraWorld((com.dfsek.terra.api.platform.world.World) this, ((FabricChunkGeneratorWrapper) chunkGenerator).getPack(), TerraFabricPlugin.getInstance()))); + TerraFabricPlugin.getInstance().logger().info("Registered world " + this + " to dimension type " + dimensionType); + } + } +} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 506962111..c8cdbaa33 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "CommandManagerMixin", "GeneratorOptionsMixin", + "ServerWorldMixin", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor", "access.StateAccessor", From d93d064d97691b47c1eaa5e0c2275ea74b38708f Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 20:34:17 -0700 Subject: [PATCH 20/28] fix getHeight --- .../FabricChunkGeneratorWrapper.java | 19 +++++++++++-------- .../terra/fabric/mixin/ServerWorldMixin.java | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index f130ceb42..40d8ca930 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -11,9 +11,11 @@ import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; +import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.population.items.TerraStructure; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.server.world.ServerWorld; @@ -30,6 +32,7 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.ChunkRandom; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.StructureAccessor; @@ -56,6 +59,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener PACK_CODEC.fieldOf("pack").stable().forGetter(generator -> generator.pack)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); private final ConfigPack pack; + private DimensionType dimensionType; public ConfigPack getPack() { return pack; @@ -88,6 +92,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } + public void setDimensionType(DimensionType dimensionType) { + this.dimensionType = dimensionType; + } + @Nullable @Override public BlockPos locateStructure(ServerWorld world, StructureFeature feature, BlockPos center, int radius, boolean skipExistingChunks) { @@ -135,22 +143,17 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public int getHeight(int x, int z, Heightmap.Type heightmapType) { - /* - TerraWorld world = TerraFabricPlugin.getInstance().getWorld(seed); + TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)); int cx = FastMath.floorMod(x, 16); int cz = FastMath.floorMod(z, 16); int height = world.getWorld().getMaxHeight(); - while (height >= 0 && sampler.sample(cx, height - 1, cz) < 0) { - height--; - } + do height--; + while(height >= 0 && sampler.sample(cx, height, cz) < 0); return height; - - */ - return 0; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java index e84407ccf..b3d5d7c97 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java @@ -28,6 +28,7 @@ public abstract class ServerWorldMixin { public void injectConstructor(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo ci) { if(chunkGenerator instanceof FabricChunkGeneratorWrapper) { TerraFabricPlugin.getInstance().getWorldMap().put(dimensionType, Pair.of((ServerWorld) (Object) this, new TerraWorld((com.dfsek.terra.api.platform.world.World) this, ((FabricChunkGeneratorWrapper) chunkGenerator).getPack(), TerraFabricPlugin.getInstance()))); + ((FabricChunkGeneratorWrapper) chunkGenerator).setDimensionType(dimensionType); TerraFabricPlugin.getInstance().logger().info("Registered world " + this + " to dimension type " + dimensionType); } } From 2fdb96a850f778c87938cbfe07b97c90a196f8bf Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 22:45:39 -0700 Subject: [PATCH 21/28] cleanup and add per-biome exclusions --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 8 ++--- ...ate.java => PackCompatibilityOptions.java} | 29 ++++++++++++++++++- .../FabricChunkGeneratorWrapper.java | 5 ++-- .../fabric/generation/TerraBiomeSource.java | 7 ++--- .../dfsek/terra/fabric/util/FabricUtil.java | 16 ++++++---- 5 files changed, 46 insertions(+), 19 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/{PackFeatureOptionsTemplate.java => PackCompatibilityOptions.java} (54%) 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 e70532142..834c7a54d 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 @@ -35,7 +35,7 @@ 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.PackFeatureOptionsTemplate; +import com.dfsek.terra.fabric.config.PackCompatibilityOptions; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; @@ -295,7 +295,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 +330,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { injectTree(treeRegistry, "CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI); injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI); - PackFeatureOptionsTemplate template = new PackFeatureOptionsTemplate(); + PackCompatibilityOptions template = new PackCompatibilityOptions(); try { event.loadTemplate(template); } catch(ConfigException e) { @@ -359,7 +359,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/PackFeatureOptionsTemplate.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java similarity index 54% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java index 48e1c9cb9..32e7c62cd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackFeatureOptionsTemplate.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PackCompatibilityOptions.java @@ -3,13 +3,16 @@ 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.HashSet; +import java.util.Map; import java.util.Set; @SuppressWarnings("FieldMayBeFinal") -public class PackFeatureOptionsTemplate implements ConfigTemplate { +public class PackCompatibilityOptions implements ConfigTemplate { @Value("features.inject-registry.enable") @Default private boolean doRegistryInjection = false; @@ -26,6 +29,18 @@ public class PackFeatureOptionsTemplate 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; } @@ -41,4 +56,16 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate { public Set getExcludedRegistryFeatures() { 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/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 40d8ca930..b27a89d60 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -148,10 +148,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener int cx = FastMath.floorMod(x, 16); int cz = FastMath.floorMod(z, 16); - int height = world.getWorld().getMaxHeight(); + int height = world.getWorld().getMaxHeight() - 1; - do height--; - while(height >= 0 && sampler.sample(cx, height, cz) < 0); + while(height >= 0 && sampler.sample(cx, height, cz) < 0) height--; return height; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index a85dcd89d..273e34b63 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -3,8 +3,8 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.util.FabricUtil; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.Identifier; @@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.feature.StructureFeature; -import java.util.Objects; import java.util.stream.Collectors; public class TerraBiomeSource extends BiomeSource { @@ -33,9 +32,7 @@ public class TerraBiomeSource extends BiomeSource { private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { - super(biomes.stream() - .filter(biome -> Objects.requireNonNull(biomes.getId(biome)).getNamespace().equals("terra")) // Filter out non-Terra biomes. - .collect(Collectors.toList())); + super(biomes.stream().collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; this.grid = pack.getBiomeProviderBuilder().build(seed); 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 72c8404c6..fdf4abcb3 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 @@ -4,7 +4,7 @@ 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.PackFeatureOptionsTemplate; +import com.dfsek.terra.fabric.config.PackCompatibilityOptions; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -17,6 +17,7 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import java.util.ArrayList; +import java.util.Collections; import java.util.Locale; import java.util.Map; import java.util.function.Supplier; @@ -52,18 +53,21 @@ public final class FabricUtil { } } + PackCompatibilityOptions compatibilityOptions = fabricAddon.getTemplates().get(pack); + for(Supplier> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { - generationSettings.structureFeature(structureFeature.get()); + Identifier key = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(structureFeature.get()); + if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !compatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { + generationSettings.structureFeature(structureFeature.get()); + } } - PackFeatureOptionsTemplate optionsTemplate = fabricAddon.getTemplates().get(pack); - - if(optionsTemplate.doBiomeInjection()) { + 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(!optionsTemplate.getExcludedBiomeFeatures().contains(key)) { + if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !compatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.feature(step, featureSupplier); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected " + key + " at stage " + step); } From 557098de1791a79068bde7759a5afbb6fe8795fb Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 22:48:03 -0700 Subject: [PATCH 22/28] use debug logger for feature info --- .../src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 834c7a54d..3662b8a22 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 @@ -342,7 +342,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { if(!template.getExcludedRegistryFeatures().contains(entry.getKey().getValue())) { try { event.getPack().getTreeRegistry().add(entry.getKey().getValue().toString(), (Tree) entry.getValue()); - main.logger().info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); + main.getDebugLogger().info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); } catch(DuplicateEntryException ignored) { } } From a3f14061ddfaf19cfb36661eb3336f087dba0664 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 17 May 2021 23:04:21 -0700 Subject: [PATCH 23/28] fix structure location --- .../terra/fabric/generation/TerraBiomeSource.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 273e34b63..d83ae46ad 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -12,8 +12,8 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.feature.StructureFeature; +import java.util.Objects; import java.util.stream.Collectors; public class TerraBiomeSource extends BiomeSource { @@ -32,7 +32,9 @@ public class TerraBiomeSource extends BiomeSource { private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { - super(biomes.stream().collect(Collectors.toList())); + super(biomes.stream() + .filter(biome -> Objects.requireNonNull(biomes.getId(biome)).getNamespace().equals("terra")) // Filter out non-Terra biomes. + .collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; this.grid = pack.getBiomeProviderBuilder().build(seed); @@ -54,10 +56,4 @@ public class TerraBiomeSource extends BiomeSource { UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX << 2, biomeZ << 2); return biomeRegistry.get(new Identifier("terra", FabricUtil.createBiomeID(pack, biome.getID()))); } - - - @Override - public boolean hasStructureFeature(StructureFeature feature) { - return false; - } } From b09d0e42aabd1ddd718955798a6b1f5c3b17bacf Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 09:06:43 -0700 Subject: [PATCH 24/28] 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); } } } From 52873238655c1bff440fac24f39ffcb364afdfaf Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 09:24:20 -0700 Subject: [PATCH 25/28] only inject carvers if vanilla.caves is enabled --- .../main/java/com/dfsek/terra/fabric/util/FabricUtil.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 9932d85c0..c761cade4 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 @@ -49,9 +49,11 @@ public final class FabricUtil { generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, TerraFabricPlugin.POPULATOR_CONFIGURED_FEATURE); - for(GenerationStep.Carver carver : GenerationStep.Carver.values()) { - for(Supplier> configuredCarverSupplier : vanilla.getGenerationSettings().getCarversForStep(carver)) { - generationSettings.carver(carver, configuredCarverSupplier.get()); + if(pack.getTemplate().vanillaCaves()) { + for(GenerationStep.Carver carver : GenerationStep.Carver.values()) { + for(Supplier> configuredCarverSupplier : vanilla.getGenerationSettings().getCarversForStep(carver)) { + generationSettings.carver(carver, configuredCarverSupplier.get()); + } } } From 7354155c52839d0325ee04502a62dbd62130d6d9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 18:14:27 -0700 Subject: [PATCH 26/28] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index db0ed685b..60ac2571e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "3", "2", true) +val versionObj = Version("5", "3", "3", true) allprojects { version = versionObj From bbe53cbca37932e7dbf3e0a7711c23f23e048ec5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 18:25:31 -0700 Subject: [PATCH 27/28] fix height again --- .../terra/fabric/generation/FabricChunkGeneratorWrapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index b27a89d60..55a935fc2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -148,9 +148,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener int cx = FastMath.floorMod(x, 16); int cz = FastMath.floorMod(z, 16); - int height = world.getWorld().getMaxHeight() - 1; + int height = world.getWorld().getMaxHeight(); - while(height >= 0 && sampler.sample(cx, height, cz) < 0) height--; + while(height >= 0 && sampler.sample(cx, height-1, cz) < 0) height--; return height; } From 2dc7b5014173bbb6d878c0c1e4aa13c7ad4be145 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 May 2021 19:50:05 -0700 Subject: [PATCH 28/28] implement getColumnSample --- .../fabric/generation/FabricChunkGeneratorWrapper.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 55a935fc2..1c9d587ed 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; @@ -157,11 +158,12 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public BlockView getColumnSample(int x, int z) { - int height = 64; // TODO: implementation + TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); + int height = getHeight(x, z, Heightmap.Type.WORLD_SURFACE); BlockState[] array = new BlockState[256]; for(int y = 255; y >= 0; y--) { if(y > height) { - if(y > getSeaLevel()) { + if(y > ((UserDefinedBiome) world.getBiomeProvider().getBiome(x, z)).getConfig().getSeaLevel()) { array[y] = Blocks.AIR.getDefaultState(); } else { array[y] = Blocks.WATER.getDefaultState();