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