diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java index 39ce7ba8d..ee5b20b02 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.util.DataUtil; +import com.dfsek.terra.util.PaletteUtil; import net.jafama.FastMath; import org.bukkit.block.data.BlockData; import org.polydev.gaea.world.palette.Palette; @@ -20,7 +20,7 @@ public class PaletteHolderBuilder { public PaletteHolder build() { Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) { - Palette d = DataUtil.BLANK_PALETTE; + Palette d = PaletteUtil.BLANK_PALETTE; for(Map.Entry> e : paletteMap.entrySet()) { if(e.getKey() >= y) { d = e.getValue(); diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index c118437e3..362be5c58 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -3,27 +3,20 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraProfiler; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.math.MathUtil; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; import com.dfsek.terra.population.StructurePopulator; import com.dfsek.terra.population.TreePopulator; -import com.dfsek.terra.util.DataUtil; +import com.dfsek.terra.util.PaletteUtil; +import com.dfsek.terra.util.SlabUtil; import org.bukkit.Chunk; -import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Waterlogged; -import org.bukkit.block.data.type.Slab; -import org.bukkit.block.data.type.Stairs; import org.bukkit.generator.BlockPopulator; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; @@ -80,73 +73,6 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } - private static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { - PaletteHolder slant = c.getSlantPalette(); - if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { - return slant.getPalette(y); - } - return c.getPalette().getPalette(y); - } - - private static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { - if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { - if(stairs != null) { - Palette stairPalette = stairs.get(down.getMaterial()); - if(stairPalette != null) { - BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()); - Stairs stairNew = (Stairs) stair.clone(); - if(placePart(orig, chunk, block, thresh, sampler, stairNew)) return; - } - } - BlockData slab = slabs.getOrDefault(down.getMaterial(), DataUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()); - if(slab instanceof Waterlogged) { - ((Waterlogged) slab).setWaterlogged(orig.matches(DataUtil.WATER)); - } else if(orig.matches(DataUtil.WATER)) return; - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); - } - } - - private static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { - if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { - if(stairs != null) { - Palette stairPalette = stairs.get(up.getMaterial()); - if(stairPalette != null) { - BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); - Stairs stairNew = (Stairs) stair.clone(); - stairNew.setHalf(Bisected.Half.TOP); - if(placePart(orig, chunk, block, thresh, sampler, stairNew)) return; - } - } - BlockData slab = slabs.getOrDefault(up.getMaterial(), DataUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()).clone(); - if(slab instanceof Bisected) ((Bisected) slab).setHalf(Bisected.Half.TOP); - if(slab instanceof Slab) ((Slab) slab).setType(Slab.Type.TOP); - if(slab instanceof Waterlogged) { - ((Waterlogged) slab).setWaterlogged(orig.matches(DataUtil.WATER)); - } else if(orig.matches(DataUtil.WATER)) return; - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); - } - } - - private static boolean placePart(BlockData orig, ChunkData chunk, Vector block, double thresh, Sampler sampler, Stairs stairNew) { - if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { - stairNew.setFacing(BlockFace.WEST); - } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { - stairNew.setFacing(BlockFace.NORTH); - } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() + 0.55) > thresh) { - stairNew.setFacing(BlockFace.SOUTH); - } else if(sampler.sample(block.getBlockX() + 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { - stairNew.setFacing(BlockFace.EAST); - } else stairNew = null; - if(stairNew != null) { - if(orig.matches(DataUtil.WATER)) stairNew.setWaterlogged(true); - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); - return true; - } - return false; - } - @Override public void attachProfiler(WorldProfiler p) { super.attachProfiler(p); @@ -189,23 +115,23 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { for(int y = world.getMaxHeight() - 1; y >= 0; y--) { if(sampler.sample(x, y, z) > 0) { justSet = true; - data = getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); + data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); chunk.setBlock(x, y, z, data); if(paletteLevel == 0 && c.doSlabs() && y < 255) { - prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), c.getSlabPalettes(), + SlabUtil.prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } paletteLevel++; } else if(y <= sea) { - if(justSet && c.doSlabs()) { - prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); + if(!(justSet && c.doSlabs())) { + SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } justSet = false; - chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); paletteLevel = 0; } else { if(justSet && c.doSlabs()) { - prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } justSet = false; paletteLevel = 0; @@ -216,7 +142,6 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { return chunk; } - private void load(World w) { try { popMan.loadBlocks(w); @@ -279,5 +204,4 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { public boolean shouldGenerateStructures() { return configPack.getTemplate().vanillaStructures(); } - } diff --git a/src/main/java/com/dfsek/terra/util/DataUtil.java b/src/main/java/com/dfsek/terra/util/DataUtil.java deleted file mode 100644 index 97f9a3a61..000000000 --- a/src/main/java/com/dfsek/terra/util/DataUtil.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.util; - -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.world.palette.Palette; -import org.polydev.gaea.world.palette.RandomPalette; - -public final class DataUtil { - public static final BlockData WATER = Material.WATER.createBlockData(); - public static final BlockData AIR = Material.AIR.createBlockData(); - public static final Palette BLANK_PALETTE = new RandomPalette(new FastRandom(2403)).add(AIR, 1); -} diff --git a/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/src/main/java/com/dfsek/terra/util/PaletteUtil.java new file mode 100644 index 000000000..c1d0e1469 --- /dev/null +++ b/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.util; + +import com.dfsek.terra.biome.palette.PaletteHolder; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.generation.Sampler; +import com.dfsek.terra.math.MathUtil; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.polydev.gaea.util.FastRandom; +import org.polydev.gaea.world.palette.Palette; +import org.polydev.gaea.world.palette.RandomPalette; + +public final class PaletteUtil { + public static final BlockData WATER = Material.WATER.createBlockData(); + public static final BlockData AIR = Material.AIR.createBlockData(); + public static final Palette BLANK_PALETTE = new RandomPalette(new FastRandom(2403)).add(AIR, 1); + + public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { + PaletteHolder slant = c.getSlantPalette(); + if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { + return slant.getPalette(y); + } + return c.getPalette().getPalette(y); + } +} diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/src/main/java/com/dfsek/terra/util/SlabUtil.java new file mode 100644 index 000000000..3ab30300c --- /dev/null +++ b/src/main/java/com/dfsek/terra/util/SlabUtil.java @@ -0,0 +1,76 @@ +package com.dfsek.terra.util; + +import com.dfsek.terra.generation.Sampler; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.type.Slab; +import org.bukkit.block.data.type.Stairs; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.util.Vector; +import org.polydev.gaea.world.palette.Palette; + +import java.util.Map; + +public final class SlabUtil { + public static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { + if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { + if(stairs != null) { + Palette stairPalette = stairs.get(down.getMaterial()); + if(stairPalette != null) { + BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()); + Stairs stairNew = (Stairs) stair.clone(); + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } + } + BlockData slab = slabs.getOrDefault(down.getMaterial(), PaletteUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()); + if(slab instanceof Waterlogged) { + ((Waterlogged) slab).setWaterlogged(orig.matches(PaletteUtil.WATER)); + } else if(orig.matches(PaletteUtil.WATER)) return; + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); + } + } + + public static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { + if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { + if(stairs != null) { + Palette stairPalette = stairs.get(up.getMaterial()); + if(stairPalette != null) { + BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); + Stairs stairNew = (Stairs) stair.clone(); + stairNew.setHalf(Bisected.Half.TOP); + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } + } + BlockData slab = slabs.getOrDefault(up.getMaterial(), PaletteUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()).clone(); + if(slab instanceof Bisected) ((Bisected) slab).setHalf(Bisected.Half.TOP); + if(slab instanceof Slab) ((Slab) slab).setType(Slab.Type.TOP); + if(slab instanceof Waterlogged) { + ((Waterlogged) slab).setWaterlogged(orig.matches(PaletteUtil.WATER)); + } else if(orig.matches(PaletteUtil.WATER)) return; // Only replace water if waterlogged. + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); + } + } + + private static boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, double thresh, Sampler sampler, Stairs stairNew) { + if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + stairNew.setFacing(BlockFace.WEST); + } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { + stairNew.setFacing(BlockFace.NORTH); + } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() + 0.55) > thresh) { + stairNew.setFacing(BlockFace.SOUTH); + } else if(sampler.sample(block.getBlockX() + 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + stairNew.setFacing(BlockFace.EAST); + } else stairNew = null; + if(stairNew != null) { + if(orig.matches(PaletteUtil.WATER)) stairNew.setWaterlogged(true); + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); + return true; + } + return false; + } +}