From ca5accafa238d23e41485c5b9c3924e0b9236c62 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 29 Sep 2020 11:23:01 -0700 Subject: [PATCH] Allow multi-level Flora, use ID hash for cave checking --- pom.xml | 2 +- .../com/dfsek/terra/carving/UserDefinedCarver.java | 2 +- .../dfsek/terra/config/genconfig/FloraConfig.java | 13 +++++++++---- .../com/dfsek/terra/population/FloraPopulator.java | 13 ++++++++----- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 4776469ba..da68dc77b 100644 --- a/pom.xml +++ b/pom.xml @@ -95,7 +95,7 @@ org.polydev gaea - 1.10.47 + 1.10.48 me.lucko diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 8fbcf69f5..c68d5b8ff 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -41,7 +41,7 @@ public class UserDefinedCarver extends Carver { @Override public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) { - return random.nextInt(100) < BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this); + return new Random(random.nextLong()+hash).nextInt(100) < BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this); } private class UserDefinedWorm extends Worm { diff --git a/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java index fd1b00143..1c0d39943 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java @@ -15,6 +15,7 @@ import org.polydev.gaea.world.palette.RandomPalette; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -81,11 +82,15 @@ public class FloraConfig extends TerraConfigObject implements Flora { } @Override - public Block getHighestValidSpawnAt(Chunk chunk, int x, int z) { + public List getValidSpawnsAt(Chunk chunk, int x, int z) { + List blocks = new ArrayList<>(); int y; - for(y = chunk.getWorld().getMaxHeight() - 1; (!spawnable.contains(chunk.getBlock(x, y, z).getType())) && y > 0; y--); - if(y <= 0) return null; - return chunk.getBlock(x, y, z); + for(y = chunk.getWorld().getMaxHeight() - 1; y > 0; y--) { + if(spawnable.contains(chunk.getBlock(x, y, z).getType()) && replaceable.contains(chunk.getBlock(x, y+1, z).getType())) { + blocks.add(chunk.getBlock(x, y, z)); + } + } + return blocks; } @Override diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 7b7305cd7..d49bde48f 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -6,6 +6,7 @@ import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.genconfig.BiomeConfig; import org.bukkit.Bukkit; import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; import org.jetbrains.annotations.NotNull; @@ -15,7 +16,9 @@ import org.polydev.gaea.population.GaeaBlockPopulator; import org.polydev.gaea.profiler.ProfileFuture; import org.polydev.gaea.world.Flora; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Random; import java.util.Set; @@ -29,17 +32,17 @@ public class FloraPopulator extends GaeaBlockPopulator { for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { UserDefinedBiome biome = (UserDefinedBiome) TerraBiomeGrid.fromWorld(world).getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); - if(biome.getDecorator().getFloraChance() <= 0 || random.nextInt(100) > biome.getDecorator().getFloraChance()) - continue; + if(biome.getDecorator().getFloraChance() <= 0) continue; try { BiomeConfig c = BiomeConfig.fromBiome(biome); for(int i = 0; i < c.getFloraAttempts(); i++) { Flora item; if(c.isFloraSimplex()) item = biome.getDecorator().getFlora().get(c.getFloraNoise(), (chunk.getX() << 4) + x, (chunk.getZ() << 4) + z); else item = biome.getDecorator().getFlora().get(random); - Block highest = item.getHighestValidSpawnAt(chunk, x, z); - if(highest != null && c.getFloraHeights(item).isInRange(highest.getY())) - item.plant(highest.getLocation()); + for(Block highest : item.getValidSpawnsAt(chunk, x, z)) { + if(c.getFloraHeights(item).isInRange(highest.getY()) && random.nextInt(100) < biome.getDecorator().getFloraChance()) + item.plant(highest.getLocation()); + } } } catch(NullPointerException ignore) {} }