From 3807b8c2772c12bcafd5adae3868b7a73875530f Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 2 Dec 2020 21:34:45 -0700 Subject: [PATCH] slabs and stairs generate on ceiling --- build.gradle.kts | 2 +- ...{Tectonic-1.0.0.jar => Tectonic-1.0.1.jar} | Bin 32156 -> 32277 bytes .../dfsek/terra/command/ReloadCommand.java | 2 +- .../com/dfsek/terra/generation/Sampler.java | 2 +- .../terra/generation/TerraChunkGenerator.java | 87 ++++++++++++------ .../dfsek/terra/registry/ConfigRegistry.java | 6 +- .../dfsek/terra/structure/spawn/AirSpawn.java | 4 +- .../terra/structure/spawn/LandSpawn.java | 4 +- .../terra/structure/spawn/OceanSpawn.java | 4 +- src/main/resources/lang/en_us.yml | 1 + 10 files changed, 76 insertions(+), 36 deletions(-) rename lib/{Tectonic-1.0.0.jar => Tectonic-1.0.1.jar} (66%) diff --git a/build.gradle.kts b/build.gradle.kts index e93c63ae9..3dd1681c0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -56,7 +56,7 @@ dependencies { implementation("net.jafama:jafama:2.3.2") - implementation(name = "Tectonic-1.0.0", group = "") + implementation(name = "Tectonic-1.0.1", group = "") // JUnit. diff --git a/lib/Tectonic-1.0.0.jar b/lib/Tectonic-1.0.1.jar similarity index 66% rename from lib/Tectonic-1.0.0.jar rename to lib/Tectonic-1.0.1.jar index 577e6ca4cafedfe473da8414892347ce410b92cb..dc4dd374088c4f119b20e09e09948cb5a815925b 100644 GIT binary patch delta 7619 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 O=odtRtmyD4^#1^qbIzdv delta 7336 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 oT2PTIZ2%f%0ZMVa6(k>wJKd%Ee_nT(cK`qY diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/src/main/java/com/dfsek/terra/command/ReloadCommand.java index d21c19e35..42ebba93f 100644 --- a/src/main/java/com/dfsek/terra/command/ReloadCommand.java +++ b/src/main/java/com/dfsek/terra/command/ReloadCommand.java @@ -31,7 +31,7 @@ public class ReloadCommand extends Command implements DebugCommand { public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { PluginConfig.load(getMain()); LangUtil.load(PluginConfig.getLanguage(), getMain()); // Load language. - ConfigRegistry.loadAll(getMain()); + if(!ConfigRegistry.loadAll(getMain())) LangUtil.send("command.reload-error", sender); TerraWorld.invalidate(); LangUtil.send("command.reload", sender); return true; diff --git a/src/main/java/com/dfsek/terra/generation/Sampler.java b/src/main/java/com/dfsek/terra/generation/Sampler.java index 4f5254e02..1bc098331 100644 --- a/src/main/java/com/dfsek/terra/generation/Sampler.java +++ b/src/main/java/com/dfsek/terra/generation/Sampler.java @@ -13,6 +13,6 @@ public class Sampler { } public double sample(double x, double y, double z) { - return interpolator.getNoise(x, y - elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)), z); + return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)); } } diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 337f01ce6..8456291ff 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -20,8 +20,10 @@ 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; @@ -85,33 +87,15 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { return c.getPalette().getPalette(y); } - private static void prepareBlockPart(BlockData down, BlockData orig, ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, ChunkInterpolator interpolator, ElevationInterpolator elevationInterpolator) { - double elevation = elevationInterpolator.getElevation(block.getBlockX(), block.getBlockZ()); - if(interpolator.getNoise(block.getBlockX(), block.getBlockY() - 0.4 - elevation, block.getBlockZ()) > thresh) { + 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(); - int elevationN = (int) elevationInterpolator.getElevation(block.getBlockX(), block.getBlockZ() - 1); // Northern elevation - int elevationS = (int) elevationInterpolator.getElevation(block.getBlockX(), block.getBlockZ() + 1); // Southern elevation - int elevationE = (int) elevationInterpolator.getElevation(block.getBlockX() + 1, block.getBlockZ()); // Eastern elevation - int elevationW = (int) elevationInterpolator.getElevation(block.getBlockX() - 1, block.getBlockZ()); // Western elevation - if(interpolator.getNoise(block.getBlockX() - 0.5, block.getBlockY() - elevationW, block.getBlockZ()) > thresh) { - stairNew.setFacing(BlockFace.WEST); - } else if(interpolator.getNoise(block.getBlockX(), block.getBlockY() - elevationN, block.getBlockZ() - 0.5) > thresh) { - stairNew.setFacing(BlockFace.NORTH); - } else if(interpolator.getNoise(block.getBlockX(), block.getBlockY() - elevationS, block.getBlockZ() + 0.5) > thresh) { - stairNew.setFacing(BlockFace.SOUTH); - } else if(interpolator.getNoise(block.getBlockX() + 0.5, block.getBlockY() - elevationE, 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; - } + if(placePart(orig, chunk, block, thresh, sampler, stairNew)) return; } } BlockData slab = slabs.getOrDefault(down.getMaterial(), DataUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()); @@ -122,6 +106,46 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { } } + 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()); + 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()); + 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); @@ -158,19 +182,30 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { int sea = c.getSeaLevel(); Palette seaPalette = c.getOceanPalette(); + + boolean justSet = false; + BlockData data = null; for(int y = world.getMaxHeight() - 1; y >= 0; y--) { if(sampler.sample(x, y, z) > 0) { - BlockData data = getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); + justSet = true; + data = getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); chunk.setBlock(x, y, z, data); if(paletteLevel == 0 && c.doSlabs() && y < 255) { - prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), c.getSlabPalettes(), - c.getStairPalettes(), c.getSlabThreshold(), interpolator, elevationInterpolator); + 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) { + justSet = false; chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); paletteLevel = 0; - } else 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); + } + justSet = false; + paletteLevel = 0; + } } } } diff --git a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index d2b11fbd6..5c961e5d6 100644 --- a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -29,13 +29,15 @@ public class ConfigRegistry extends TerraRegistry { add(pack.getTemplate().getID(), pack); } - public static void loadAll(JavaPlugin main) { + public static boolean loadAll(JavaPlugin main) { + boolean valid = true; File packsFolder = new File(main.getDataFolder(), "packs"); for(File dir : packsFolder.listFiles(File::isDirectory)) { try { getRegistry().load(dir); } catch(ConfigException e) { e.printStackTrace(); + valid = false; } } for(File zip : packsFolder.listFiles(file -> file.getName().endsWith(".zip") || file.getName().endsWith(".jar") || file.getName().endsWith(".terra"))) { @@ -44,8 +46,10 @@ public class ConfigRegistry extends TerraRegistry { getRegistry().load(new ZipFile(zip)); } catch(IOException | ConfigException e) { e.printStackTrace(); + valid = false; } } + return valid; } public void load(ZipFile file) throws ConfigException { diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java index 44bcc684c..ee1037798 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java @@ -18,7 +18,7 @@ public class AirSpawn extends Requirement { UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y <= c.getSeaLevel()) return false; - int yf = (int) (y - ((WorldGenerator) b.getGenerator()).getElevation(x, z)); - return b.getGenerator().getNoise(getNoise(), getWorld(), x, yf, z) <= 0; + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) + elevation <= 0; } } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java index 50f210215..ffc6132b6 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java @@ -15,7 +15,7 @@ public class LandSpawn extends Requirement { public boolean matches(int x, int y, int z) { TerraWorld tw = TerraWorld.getWorld(getWorld()); UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - int yf = (int) (y - ((WorldGenerator) b.getGenerator()).getElevation(x, z)); - return b.getGenerator().getNoise(getNoise(), getWorld(), x, yf, z) > 0; + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) + elevation > 0; } } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java index fd6aa864a..936a51940 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java @@ -18,7 +18,7 @@ public class OceanSpawn extends Requirement { UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y > c.getSeaLevel()) return false; - int yf = (int) (y - ((WorldGenerator) b.getGenerator()).getElevation(x, z)); - return b.getGenerator().getNoise(getNoise(), getWorld(), x, yf, z) <= 0; + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) + elevation <= 0; } } diff --git a/src/main/resources/lang/en_us.yml b/src/main/resources/lang/en_us.yml index 2c7228527..cfcfcff3c 100644 --- a/src/main/resources/lang/en_us.yml +++ b/src/main/resources/lang/en_us.yml @@ -11,6 +11,7 @@ command: players-only: "Command is for players only." world: "This command must be executed in a Terra world!" reload: "Reloaded Terra config." + reload-error: "Errors occurred while reloading Terra configurations. See logs for more information." version: "This server is running Terra version \"%1$s\", implementing Gaea version \"%2$s\"" main-menu: - "--------------------Terra--------------------"