diff --git a/src/main/java/carpet/helpers/FeatureGenerator.java b/src/main/java/carpet/helpers/FeatureGenerator.java index ca4209fa..325cf8e4 100644 --- a/src/main/java/carpet/helpers/FeatureGenerator.java +++ b/src/main/java/carpet/helpers/FeatureGenerator.java @@ -10,10 +10,8 @@ import net.minecraft.structure.pool.StructurePool; import net.minecraft.structure.pool.StructurePoolElement; import net.minecraft.structure.processor.StructureProcessorLists; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; @@ -37,6 +35,7 @@ import net.minecraft.world.gen.feature.TreeFeatureConfig; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Supplier; public class FeatureGenerator { @@ -58,19 +57,46 @@ public class FeatureGenerator } - ConfiguredFeature feature = world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_KEY).get(id); - if (feature != null) + ConfiguredFeature configuredFeature = world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_KEY).get(id); + if (configuredFeature != null) { CarpetSettings.skipGenerationChecks.set(true); try { - return feature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos); + return configuredFeature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos); } finally { CarpetSettings.skipGenerationChecks.set(false); } } + StructureFeature structure = Registry.STRUCTURE_FEATURE.get(id); + if (structure != null) + { + ConfiguredStructureFeature configuredStandard = getDefaultFeature(structure, world, pos, true); + if (configuredStandard != null) + return ((StructureFeatureInterface)configuredStandard.feature).plopAnywhere( + world, pos, world.getChunkManager().getChunkGenerator(), + false, world.getRegistryManager().get(Registry.BIOME_KEY).get(BiomeKeys.PLAINS), configuredStandard.config); + + } + Feature feature = Registry.FEATURE.get(id); + if (feature != null) + { + ConfiguredFeature configuredStandard = getDefaultFeature(feature, world, pos, true); + if (configuredStandard != null) + { + CarpetSettings.skipGenerationChecks.set(true); + try + { + return configuredStandard.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos); + } + finally + { + CarpetSettings.skipGenerationChecks.set(false); + } + } + } return null; } @@ -147,6 +173,22 @@ public class FeatureGenerator findFirst().map(Map.Entry::getValue).orElse(null); } + private static ConfiguredFeature getDefaultFeature(Feature feature, ServerWorld world, BlockPos pos, boolean tryHard) + { + List>>> configuredStepFeatures = world.getBiome(pos).getGenerationSettings().getFeatures(); + for (List>> step: configuredStepFeatures) + for (Supplier> provider: step) + { + ConfiguredFeature configuredFeature = provider.get(); + if (configuredFeature.feature == feature) + return configuredFeature; + } + if (!tryHard) return null; + return world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_KEY).getEntries().stream(). + filter(cS -> cS.getValue().feature == feature). + findFirst().map(Map.Entry::getValue).orElse(null); + } + public static StructureStart shouldStructureStartAt(ServerWorld world, BlockPos pos, StructureFeature structure, boolean computeBox) { long seed = world.getSeed();