From 72d4c7eb40039fe81d5396707133767b0ca481b9 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 21 Jul 2020 04:23:02 -0400 Subject: [PATCH] Kboom --- src/main/java/ninja/bytecode/iris/Iris.java | 37 +++++++++++ .../iris/generator/TerrainChunkGenerator.java | 7 +- .../ninja/bytecode/iris/object/IrisBiome.java | 65 +++++++++++++++++++ .../iris/object/IrisBiomeDecorator.java | 13 +++- 4 files changed, 117 insertions(+), 5 deletions(-) diff --git a/src/main/java/ninja/bytecode/iris/Iris.java b/src/main/java/ninja/bytecode/iris/Iris.java index 90558bf9d..e05dc3573 100644 --- a/src/main/java/ninja/bytecode/iris/Iris.java +++ b/src/main/java/ninja/bytecode/iris/Iris.java @@ -46,6 +46,7 @@ import ninja.bytecode.iris.util.Desc; import ninja.bytecode.iris.util.Direction; import ninja.bytecode.iris.util.GroupedExecutor; import ninja.bytecode.iris.util.IO; +import ninja.bytecode.iris.util.RNG; import ninja.bytecode.iris.util.ScoreDirection; import ninja.bytecode.iris.wand.WandController; import ninja.bytecode.shuriken.collections.KList; @@ -207,6 +208,7 @@ public class Iris extends JavaPlugin implements BoardProvider { imsg(sender, "/iris dev [dimension] - Create a new dev world"); imsg(sender, "/iris what - Data about items & blocks"); + imsg(sender, "/iris goto - Fast goto biome"); imsg(sender, "/iris wand [?] - Get a wand / help"); imsg(sender, "/iris save - Save object"); imsg(sender, "/iris load - Load & place object"); @@ -214,6 +216,41 @@ public class Iris extends JavaPlugin implements BoardProvider if(args.length >= 1) { + if(args[0].equalsIgnoreCase("goto") && args.length == 2) + { + if(sender instanceof Player) + { + Player p = (Player) sender; + World world = p.getWorld(); + IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + int tries = 10000; + IrisBiome biome = data.getBiomeLoader().load(args[1]); + + if(biome == null) + { + sender.sendMessage("Not a biome. Use the file name (without extension)"); + } + + while(tries > 0) + { + tries--; + + int xx = (int) (RNG.r.i(-29999970, 29999970)); + int zz = (int) (RNG.r.i(-29999970, 29999970)); + if(g.sampleTrueBiome(xx, zz).getBiome().getLoadKey().equals(biome.getLoadKey())) + { + p.teleport(new Location(world, xx, world.getHighestBlockYAt(xx, zz), zz)); + sender.sendMessage("Found in " + (10000 - tries) + "!"); + return true; + } + } + + sender.sendMessage("Tried to find " + biome.getName() + " looked in 10,000 places no dice."); + + return true; + } + } + if(args[0].equalsIgnoreCase("what")) { if(args.length != 2) diff --git a/src/main/java/ninja/bytecode/iris/generator/TerrainChunkGenerator.java b/src/main/java/ninja/bytecode/iris/generator/TerrainChunkGenerator.java index c8a542be4..4ab16d412 100644 --- a/src/main/java/ninja/bytecode/iris/generator/TerrainChunkGenerator.java +++ b/src/main/java/ninja/bytecode/iris/generator/TerrainChunkGenerator.java @@ -118,6 +118,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator int height = (int) Math.round(noise) + fluidHeight; IrisBiome biome = sampleTrueBiome(rx, rz).getBiome(); KList layers = biome.generateLayers(wx, wz, masterRandom, height); + KList seaLayers = biome.isSea() ? biome.generateSeaLayers(wx, wz, masterRandom, fluidHeight - height) : new KList<>(); for(int k = Math.max(height, fluidHeight); k < 255; k++) { @@ -150,7 +151,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator if(underwater) { - block = WATER; + block = seaLayers.hasIndex(fluidHeight - k) ? layers.get(depth) : WATER; } else @@ -219,14 +220,14 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator if(stack == 1) { - sliver.setSilently(k + 1, d); + sliver.set(k + 1, d); } else if(k < 255 - stack) { for(int l = 0; l < stack; l++) { - sliver.setSilently(k + l + 1, d); + sliver.set(k + l + 1, d); } } } diff --git a/src/main/java/ninja/bytecode/iris/object/IrisBiome.java b/src/main/java/ninja/bytecode/iris/object/IrisBiome.java index 21d59eb16..fc708fda7 100644 --- a/src/main/java/ninja/bytecode/iris/object/IrisBiome.java +++ b/src/main/java/ninja/bytecode/iris/object/IrisBiome.java @@ -46,6 +46,9 @@ public class IrisBiome extends IrisRegistrant @Desc("This defines the layers of materials in this biome. Each layer has a palette and min/max height and some other properties. Usually a grassy/sandy layer then a dirt layer then a stone layer. Iris will fill in the remaining blocks below your layers with stone.") private KList layers = new KList().qadd(new IrisBiomePaletteLayer()); + @Desc("This defines the layers of materials in this biome. Each layer has a palette and min/max height and some other properties. Usually a grassy/sandy layer then a dirt layer then a stone layer. Iris will fill in the remaining blocks below your layers with stone.") + private KList seaLayers = new KList(); + @Desc("Decorators are used for things like tall grass, bisected flowers, and even kelp or cactus (random heights)") private KList decorators = new KList(); @@ -60,7 +63,9 @@ public class IrisBiome extends IrisRegistrant private transient InferredType inferredType; private transient CNG biomeGenerator; private transient KList layerHeightGenerators; + private transient KList layerSeaHeightGenerators; private transient KList layerSurfaceGenerators; + private transient KList layerSeaSurfaceGenerators; public IrisBiome() { @@ -141,6 +146,47 @@ public class IrisBiome extends IrisRegistrant return data; } + public KList generateSeaLayers(double wx, double wz, RNG random, int maxDepth) + { + KList data = new KList<>(); + + for(int i = 0; i < seaLayers.size(); i++) + { + CNG hgen = getLayerSeaHeightGenerators(random).get(i); + int d = hgen.fit(seaLayers.get(i).getMinHeight(), seaLayers.get(i).getMaxHeight(), wx / seaLayers.get(i).getTerrainZoom(), wz / seaLayers.get(i).getTerrainZoom()); + + if(d < 0) + { + continue; + } + + for(int j = 0; j < d; j++) + { + if(data.size() >= maxDepth) + { + break; + } + + try + { + data.add(getSeaLayers().get(i).get(random.nextParallelRNG(i + j), (wx + j) / seaLayers.get(i).getTerrainZoom(), j, (wz - j) / seaLayers.get(i).getTerrainZoom())); + } + + catch(Throwable e) + { + L.ex(e); + } + } + + if(data.size() >= maxDepth) + { + break; + } + } + + return data; + } + public KList getLayerHeightGenerators(RNG rng) { lock.lock(); @@ -160,6 +206,25 @@ public class IrisBiome extends IrisRegistrant return layerHeightGenerators; } + public KList getLayerSeaHeightGenerators(RNG rng) + { + lock.lock(); + if(layerSeaHeightGenerators == null) + { + layerSeaHeightGenerators = new KList<>(); + + int m = 7735; + + for(IrisBiomePaletteLayer i : getSeaLayers()) + { + layerSeaHeightGenerators.add(i.getHeightGenerator(rng.nextParallelRNG((m++) * m * m * m))); + } + } + lock.unlock(); + + return layerSeaHeightGenerators; + } + public boolean isLand() { if(inferredType == null) diff --git a/src/main/java/ninja/bytecode/iris/object/IrisBiomeDecorator.java b/src/main/java/ninja/bytecode/iris/object/IrisBiomeDecorator.java index c674743dd..a4fddcc23 100644 --- a/src/main/java/ninja/bytecode/iris/object/IrisBiomeDecorator.java +++ b/src/main/java/ninja/bytecode/iris/object/IrisBiomeDecorator.java @@ -44,6 +44,7 @@ public class IrisBiomeDecorator private transient KMap layerGenerators; private transient CNG heightGenerator; private transient KList blockData; + private transient RNG nrng; public int getHeight(RNG rng, double x, double z) { @@ -105,11 +106,19 @@ public class IrisBiomeDecorator return null; } - if(getGenerator(rng).fitDoubleD(0D, 1D, x * (dispersion.equals(Dispersion.SCATTER) ? 1000D : 1D), z * (dispersion.equals(Dispersion.SCATTER) ? 1000D : 1D)) <= chance) + if(nrng == null) + { + nrng = rng.nextParallelRNG(2398552 + hashCode()); + } + + double xx = dispersion.equals(Dispersion.SCATTER) ? nrng.i(-100000, 100000) : x; + double zz = dispersion.equals(Dispersion.SCATTER) ? nrng.i(-100000, 100000) : z; + + if(getGenerator(rng).fitDoubleD(0D, 1D, xx, zz) <= chance) { try { - return getBlockData().get(getGenerator(rng.nextParallelRNG(53)).fit(0, getBlockData().size() - 1, x * (dispersion.equals(Dispersion.SCATTER) ? 1000D : 1D), z * (dispersion.equals(Dispersion.SCATTER) ? 1000D : 1D))); + return getBlockData().get(getGenerator(rng.nextParallelRNG(53)).fit(0, getBlockData().size() - 1, xx, zz)); } catch(Throwable e)