From 9b793de3771cfb4a1ac364110eaea74b1f0b8b5e Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 28 Nov 2021 23:32:24 +0100 Subject: [PATCH] fix #1188 fix structure eligibility with strongholds --- .../carpet/fakes/ChunkGeneratorInterface.java | 3 ++ .../java/carpet/helpers/FeatureGenerator.java | 31 ++++++++++++++----- .../mixins/ChunkGenerator_scarpetMixin.java | 9 +++++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/main/java/carpet/fakes/ChunkGeneratorInterface.java b/src/main/java/carpet/fakes/ChunkGeneratorInterface.java index 3206e3a7..834662bf 100644 --- a/src/main/java/carpet/fakes/ChunkGeneratorInterface.java +++ b/src/main/java/carpet/fakes/ChunkGeneratorInterface.java @@ -1,6 +1,9 @@ package carpet.fakes; +import net.minecraft.world.biome.Biome; + public interface ChunkGeneratorInterface { void initStrongholds(); + boolean canPlaceStrongholdInBiomeCM(Biome biome); } diff --git a/src/main/java/carpet/helpers/FeatureGenerator.java b/src/main/java/carpet/helpers/FeatureGenerator.java index 8ded2147..41410554 100644 --- a/src/main/java/carpet/helpers/FeatureGenerator.java +++ b/src/main/java/carpet/helpers/FeatureGenerator.java @@ -1,13 +1,13 @@ package carpet.helpers; import carpet.CarpetSettings; +import carpet.fakes.ChunkGeneratorInterface; import carpet.fakes.PlacedFeatureInterface; import carpet.fakes.StructureFeatureInterface; import com.mojang.datafixers.util.Pair; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.server.world.ServerWorld; -import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.structure.pool.StructurePool; import net.minecraft.structure.pool.StructurePoolElement; @@ -19,18 +19,17 @@ import net.minecraft.util.math.intprovider.ConstantIntProvider; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.StructurePresence; +import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.BuiltinBiomes; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.StructuresConfig; -import net.minecraft.world.gen.decorator.PlacementModifier; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import net.minecraft.world.gen.feature.PlacedFeature; import net.minecraft.world.gen.feature.size.TwoLayersFeatureSize; import net.minecraft.world.gen.foliage.BlobFoliagePlacer; import net.minecraft.world.gen.foliage.LargeOakFoliagePlacer; -import net.minecraft.world.gen.random.AtomicSimpleRandom; -import net.minecraft.world.gen.random.ChunkRandom; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.StructureConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -41,7 +40,6 @@ import net.minecraft.world.gen.feature.SimpleRandomFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import net.minecraft.world.gen.feature.StructurePoolFeatureConfig; import net.minecraft.world.gen.feature.TreeFeatureConfig; -import net.minecraft.world.gen.random.RandomSeed; import net.minecraft.world.gen.stateprovider.BlockStateProvider; import net.minecraft.world.gen.treedecorator.BeehiveTreeDecorator; import net.minecraft.world.gen.trunk.LargeOakTrunkPlacer; @@ -207,10 +205,12 @@ public class FeatureGenerator public static StructureStart shouldStructureStartAt(ServerWorld world, BlockPos pos, StructureFeature structure, boolean computeBox) { + if (structure == StructureFeature.STRONGHOLD) + return shouldStrongholdStartAt(world, pos, computeBox); long seed = world.getSeed(); ChunkGenerator generator = world.getChunkManager().getChunkGenerator(); StructuresConfig settings = generator.getStructuresConfig(); - StructureConfig structureConfig = generator.getStructuresConfig().getForType(structure); + StructureConfig structureConfig = settings.getForType(structure); var structures = settings.getConfiguredStructureFeature(structure); if (structureConfig == null || structures.isEmpty()) { return null; @@ -246,7 +246,24 @@ public class FeatureGenerator world.getStructureManager(), seed, chunkPos, 0, structureConfig, world, (b) -> biomeRegistry.getKey(b).filter(biomeConfig::contains).isPresent()); if (filledStructure != null && filledStructure.hasChildren()) return filledStructure; - //} + return null; + } + + public static StructureStart shouldStrongholdStartAt(ServerWorld world, BlockPos pos, boolean computeBox) + { + ChunkGenerator generator = world.getChunkManager().getChunkGenerator(); + if (world.getRegistryKey() != World.OVERWORLD || !generator.isStrongholdStartingChunk(new ChunkPos(pos))) return null; + if (!computeBox) return StructureStart.DEFAULT; + StructuresConfig settings = generator.getStructuresConfig(); + StructureConfig structureConfig = settings.getForType(StructureFeature.STRONGHOLD); + if (structureConfig != null) { + StructureStart filledStructure = ConfiguredStructureFeatures.STRONGHOLD.tryPlaceStart(world.getRegistryManager(), generator, generator.getBiomeSource(), + world.getStructureManager(), world.getSeed(), new ChunkPos(pos), 0, + structureConfig, world, ((ChunkGeneratorInterface)generator)::canPlaceStrongholdInBiomeCM + ); + if (filledStructure != null && filledStructure.hasChildren()) + return filledStructure; + } return null; } diff --git a/src/main/java/carpet/mixins/ChunkGenerator_scarpetMixin.java b/src/main/java/carpet/mixins/ChunkGenerator_scarpetMixin.java index 4121e9cf..1fd3fd76 100644 --- a/src/main/java/carpet/mixins/ChunkGenerator_scarpetMixin.java +++ b/src/main/java/carpet/mixins/ChunkGenerator_scarpetMixin.java @@ -1,6 +1,7 @@ package carpet.mixins; import carpet.fakes.ChunkGeneratorInterface; +import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,10 +10,16 @@ import org.spongepowered.asm.mixin.Shadow; public abstract class ChunkGenerator_scarpetMixin implements ChunkGeneratorInterface { @Shadow protected abstract void generateStrongholdPositions(); + @Shadow private static boolean canPlaceStrongholdInBiome(Biome biome) { return true;} - @Override + @Override public void initStrongholds() { generateStrongholdPositions(); } + + @Override + public boolean canPlaceStrongholdInBiomeCM(Biome biome) { + return canPlaceStrongholdInBiome(biome); + } }