From d75cd8140872011ef9679a9b1e18fa1aed42afde Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 10 Nov 2020 23:20:34 -0700 Subject: [PATCH] Implement slant palettes --- .../dfsek/terra/biome/failsafe/FailType.java | 2 +- .../config/genconfig/biome/BiomeConfig.java | 15 +++ .../terra/generation/TerraChunkGenerator.java | 92 +++++++++++-------- .../biomes/mountain/arid_mountains.yml | 2 + .../palettes/mountains/stone_side.yml | 5 + 5 files changed, 77 insertions(+), 39 deletions(-) create mode 100644 src/main/resources/default-config/palettes/mountains/stone_side.yml diff --git a/src/main/java/com/dfsek/terra/biome/failsafe/FailType.java b/src/main/java/com/dfsek/terra/biome/failsafe/FailType.java index 8c2e25f75..bc5c7f959 100644 --- a/src/main/java/com/dfsek/terra/biome/failsafe/FailType.java +++ b/src/main/java/com/dfsek/terra/biome/failsafe/FailType.java @@ -27,7 +27,7 @@ public enum FailType { }, /** * Returns null, hard crashing the server, but not generating any corrupted terrain.
- * This option is
NOT
stable, but it has the least risk of blank chunks being generated. + * This option is NOT stable, but it has the least risk of blank chunks being generated. * However, it has the highest risk of corruption! */ CRASH { diff --git a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeConfig.java index 050e92c19..2a8b0c3b5 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeConfig.java @@ -10,10 +10,12 @@ import com.dfsek.terra.config.exception.NotFoundException; import com.dfsek.terra.config.genconfig.structure.StructureConfig; import com.dfsek.terra.generation.UserDefinedDecorator; import com.dfsek.terra.generation.UserDefinedGenerator; +import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.polydev.gaea.math.Range; import org.polydev.gaea.tree.Tree; import org.polydev.gaea.world.Flora; +import org.polydev.gaea.world.palette.Palette; import parsii.tokenizer.ParseException; import java.io.File; @@ -36,6 +38,7 @@ public class BiomeConfig extends TerraConfig { private final BiomeSnowConfig snow; private final List structures; private final ConfigPack config; + private final Palette slant; private String eq; public BiomeConfig(File file, ConfigPack config) throws InvalidConfigurationException, IOException { @@ -120,6 +123,14 @@ public class BiomeConfig extends TerraConfig { Debug.info("Using super snow"); } else snow = new BiomeSnowConfig(this); + // Get slant palette + if(contains("slant-palette")) { + String slantS = getString("slant-palette"); + slant = config.getPalette(slantS).getPalette(); + Debug.info("Using slant palette: " + slantS); + if(slant == null) throw new NotFoundException("Slant Palette", slantS, getID()); + } else slant = null; + //Make sure equation is non-null if(eq == null || eq.equals("")) throw new ConfigException("Could not find noise equation! Biomes must include a noise equation, or extend an abstract biome with one.", getID()); @@ -175,6 +186,10 @@ public class BiomeConfig extends TerraConfig { return flora.getFloraHeights().computeIfAbsent(f, input -> new Range(-1, -1)); } + public Palette getSlant() { + return slant; + } + @Override public String toString() { return "Biome with ID " + getID() + " and noise equation " + eq; diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index a27f5b11c..685e284ea 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -80,47 +80,24 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { popMan.attachProfiler(p); } - @Override - public ChunkData generateBase(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkInterpolator interpolator) { - if(needsLoad) load(world); // Load population data for world. - ChunkData chunk = createChunkData(world); - TerraWorld tw = TerraWorld.getWorld(world); - if(!tw.isSafe()) return chunk; - ConfigPack config = tw.getConfig(); - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - org.polydev.gaea.biome.BiomeGrid grid = getBiomeGrid(world); - for(byte x = 0; x < 16; x++) { - for(byte z = 0; z < 16; z++) { - int paletteLevel = 0; - int cx = xOrig + x; - int cz = zOrig + z; - Biome b = grid.getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY); - BiomeConfig c = config.getBiome((UserDefinedBiome) b); - BiomeSlabConfig slab = c.getSlabs(); - int sea = c.getOcean().getSeaLevel(); - Palette seaPalette = c.getOcean().getOcean(); - for(int y = world.getMaxHeight() - 1; y >= 0; y--) { - if(interpolator.getNoise(x, y, z) > 0) { - BlockData data = b.getGenerator().getPalette(y).get(paletteLevel, cx, cz); - chunk.setBlock(x, y, z, data); - if(paletteLevel == 0 && slab != null && y < 255) { - prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(), - slab.getStairs(), slab.getSlabThreshold(), interpolator); - } - paletteLevel++; - } else if(y <= sea) { - chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); - paletteLevel = 0; - } else paletteLevel = 0; - } - } + private static Palette getPalette(int x, int y, int z, BiomeConfig c, ChunkInterpolator interpolator) { + Palette slant = c.getSlant(); + if(slant != null) { + boolean north = interpolator.getNoise(x, y, z + 1) > 0; + boolean south = interpolator.getNoise(x, y, z - 1) > 0; + boolean east = interpolator.getNoise(x + 1, y, z) > 0; + boolean west = interpolator.getNoise(x - 1, y, z) > 0; + + boolean top = interpolator.getNoise(x, y + 0.25, z) > 0; + boolean bottom = interpolator.getNoise(x, y - 0.25, z) > 0; + + if((top && bottom) && (north || south || east || west) && (!(north && south && east && west))) return slant; } - return chunk; + return c.getBiome().getGenerator().getPalette(y); } - private void prepareBlockPart(BlockData down, BlockData orig, ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, ChunkInterpolator interpolator) { + private static void prepareBlockPart(BlockData down, BlockData orig, ChunkData chunk, Vector block, Map> slabs, + Map> stairs, double thresh, ChunkInterpolator interpolator) { if(interpolator.getNoise(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { if(stairs != null) { Palette stairPalette = stairs.get(down.getMaterial()); @@ -151,6 +128,45 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { } } + @Override + public ChunkData generateBase(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkInterpolator interpolator) { + if(needsLoad) load(world); // Load population data for world. + ChunkData chunk = createChunkData(world); + TerraWorld tw = TerraWorld.getWorld(world); + if(!tw.isSafe()) return chunk; + ConfigPack config = tw.getConfig(); + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + org.polydev.gaea.biome.BiomeGrid grid = getBiomeGrid(world); + for(byte x = 0; x < 16; x++) { + for(byte z = 0; z < 16; z++) { + int paletteLevel = 0; + int cx = xOrig + x; + int cz = zOrig + z; + Biome b = grid.getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY); + BiomeConfig c = config.getBiome((UserDefinedBiome) b); + BiomeSlabConfig slab = c.getSlabs(); + int sea = c.getOcean().getSeaLevel(); + Palette seaPalette = c.getOcean().getOcean(); + for(int y = world.getMaxHeight() - 1; y >= 0; y--) { + if(interpolator.getNoise(x, y, z) > 0) { + BlockData data = getPalette(x, y, z, c, interpolator).get(paletteLevel, cx, cz); + chunk.setBlock(x, y, z, data); + if(paletteLevel == 0 && slab != null && y < 255) { + prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(), + slab.getStairs(), slab.getSlabThreshold(), interpolator); + } + paletteLevel++; + } else if(y <= sea) { + chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); + paletteLevel = 0; + } else paletteLevel = 0; + } + } + } + return chunk; + } + private void load(World w) { try { popMan.loadBlocks(w); diff --git a/src/main/resources/default-config/biomes/mountain/arid_mountains.yml b/src/main/resources/default-config/biomes/mountain/arid_mountains.yml index 0e941cb15..d5ae06d99 100644 --- a/src/main/resources/default-config/biomes/mountain/arid_mountains.yml +++ b/src/main/resources/default-config/biomes/mountain/arid_mountains.yml @@ -13,6 +13,8 @@ palette: vanilla: SAVANNA erodible: false +prevent-smooth: true +slant-palette: STONE flora: chance: 40 diff --git a/src/main/resources/default-config/palettes/mountains/stone_side.yml b/src/main/resources/default-config/palettes/mountains/stone_side.yml new file mode 100644 index 000000000..148910d27 --- /dev/null +++ b/src/main/resources/default-config/palettes/mountains/stone_side.yml @@ -0,0 +1,5 @@ +layers: + - materials: + - "minecraft:diamond_block": 1 + layers: 1 +id: "STONE" \ No newline at end of file