From 0600176e31baaf37ad23f832a912ae1a146f6971 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 28 May 2021 13:34:12 -0700 Subject: [PATCH] override entity spawning stuff --- .../FabricChunkGeneratorWrapper.java | 26 ++++++++++++++++++- .../ForgeChunkGeneratorWrapper.java | 12 ++++++++- 2 files changed, 36 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 d24733624..2d328ebab 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 @@ -20,6 +20,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.SpawnGroup; import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockPos; @@ -32,6 +33,7 @@ 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.SpawnSettings; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; @@ -44,6 +46,7 @@ import net.minecraft.world.gen.chunk.VerticalBlockSample; import net.minecraft.world.gen.feature.StructureFeature; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -147,7 +150,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener public int getHeight(int x, int z, Heightmap.Type heightmapType) { TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); int height = world.getWorld().getMaxHeight(); - while(height >= 0 && !heightmapType.getBlockPredicate().test(((FabricBlockData) world.getUngeneratedBlock(x, height-1, z)).getHandle())) { + while(height >= 0 && !heightmapType.getBlockPredicate().test(((FabricBlockData) world.getUngeneratedBlock(x, height - 1, z)).getHandle())) { height--; } return height; @@ -173,6 +176,27 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return new VerticalBlockSample(array); } + @Override + public List getEntitySpawnList(Biome biome, StructureAccessor accessor, SpawnGroup group, BlockPos pos) { + if(pack.getTemplate().vanillaStructures()) { + if(accessor.getStructureAt(pos, true, StructureFeature.SWAMP_HUT).hasChildren()) { + if(group == SpawnGroup.MONSTER) return StructureFeature.SWAMP_HUT.getMonsterSpawns(); + if(group == SpawnGroup.CREATURE) return StructureFeature.SWAMP_HUT.getCreatureSpawns(); + } + + if(group == SpawnGroup.MONSTER) { + if(accessor.getStructureAt(pos, false, StructureFeature.PILLAGER_OUTPOST).hasChildren()) { + return StructureFeature.PILLAGER_OUTPOST.getMonsterSpawns(); + } else if(accessor.getStructureAt(pos, false, StructureFeature.MONUMENT).hasChildren()) { + return StructureFeature.MONUMENT.getMonsterSpawns(); + } else if(accessor.getStructureAt(pos, true, StructureFeature.FORTRESS).hasChildren()) { + return StructureFeature.FORTRESS.getMonsterSpawns(); + } + } + } + return super.getEntitySpawnList(biome, accessor, group, pos); + } + @Override public void populateEntities(ChunkRegion region) { if(pack.getTemplate().vanillaMobs()) { diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/generation/ForgeChunkGeneratorWrapper.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/generation/ForgeChunkGeneratorWrapper.java index 9e40a8a94..4e972d7cd 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/generation/ForgeChunkGeneratorWrapper.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/generation/ForgeChunkGeneratorWrapper.java @@ -20,6 +20,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.EntityClassification; import net.minecraft.util.SharedSeedRandom; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; @@ -31,6 +32,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeManager; +import net.minecraft.world.biome.MobSpawnInfo; import net.minecraft.world.chunk.IChunk; import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.gen.GenerationStage; @@ -45,6 +47,7 @@ import net.minecraft.world.spawner.WorldEntitySpawner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -143,7 +146,7 @@ public class ForgeChunkGeneratorWrapper extends ChunkGenerator implements Genera public int getBaseHeight(int x, int z, Heightmap.@NotNull Type type) { TerraWorld world = TerraForgePlugin.getInstance().getWorld(dimensionType); int height = world.getWorld().getMaxHeight(); - while(height >= 0 && !type.isOpaque().test(((ForgeBlockData) world.getUngeneratedBlock(x, height-1, z)).getHandle())) { + while(height >= 0 && !type.isOpaque().test(((ForgeBlockData) world.getUngeneratedBlock(x, height - 1, z)).getHandle())) { height--; } return height; @@ -181,6 +184,13 @@ public class ForgeChunkGeneratorWrapper extends ChunkGenerator implements Genera } } + @Override + public List getMobsAt(Biome p_230353_1_, StructureManager p_230353_2_, EntityClassification p_230353_3_, BlockPos p_230353_4_) { + List spawns = net.minecraftforge.common.world.StructureSpawnManager.getStructureSpawns(p_230353_2_, p_230353_3_, p_230353_4_); + if(spawns != null) return spawns; + return super.getMobsAt(p_230353_1_, p_230353_2_, p_230353_3_, p_230353_4_); + } + @Override public TerraChunkGenerator getHandle() { return delegate;