From 5fbcdea9e7a0a4c9556ac1097c2ab6c574790502 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 | 37 +++++++++++++++---- .../ForgeChunkGeneratorWrapper.java | 25 ++++++++----- 2 files changed, 45 insertions(+), 17 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 1c9d587ed..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 @@ -9,6 +9,7 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.block.FabricBlockData; import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; @@ -19,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; @@ -31,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; @@ -43,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; @@ -67,7 +71,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { - super(biomeSource, new StructuresConfig(false)); + super(biomeSource, new StructuresConfig(configPack.getTemplate().vanillaStructures())); this.pack = configPack; this.delegate = new DefaultChunkGenerator3D(pack, TerraFabricPlugin.getInstance()); @@ -145,14 +149,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public int getHeight(int x, int z, Heightmap.Type heightmapType) { 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--; - + while(height >= 0 && !heightmapType.getBlockPredicate().test(((FabricBlockData) world.getUngeneratedBlock(x, height - 1, z)).getHandle())) { + height--; + } return height; } @@ -176,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 3a34608b6..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 @@ -10,6 +10,7 @@ import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.forge.ForgeAdapter; import com.dfsek.terra.forge.TerraForgePlugin; +import com.dfsek.terra.forge.block.ForgeBlockData; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; @@ -19,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; @@ -30,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; @@ -44,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; @@ -69,7 +73,7 @@ public class ForgeChunkGeneratorWrapper extends ChunkGenerator implements Genera private DimensionType dimensionType; public ForgeChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { - super(biomeSource, new DimensionStructuresSettings(false)); + super(biomeSource, new DimensionStructuresSettings(configPack.getTemplate().vanillaStructures())); this.pack = configPack; this.delegate = new DefaultChunkGenerator3D(pack, TerraForgePlugin.getInstance()); @@ -139,16 +143,12 @@ public class ForgeChunkGeneratorWrapper extends ChunkGenerator implements Genera } @Override - public int getBaseHeight(int x, int z, Heightmap.@NotNull Type p_222529_3_) { + public int getBaseHeight(int x, int z, Heightmap.@NotNull Type type) { TerraWorld world = TerraForgePlugin.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--; - + while(height >= 0 && !type.isOpaque().test(((ForgeBlockData) world.getUngeneratedBlock(x, height - 1, z)).getHandle())) { + height--; + } return height; } @@ -184,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;