From f1dfb1c952368357f76d3becbed32b0557c68e77 Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Fri, 9 Jul 2021 23:21:55 +1200 Subject: [PATCH 1/5] Decor Updates - Fixed decorators using the same RNG when picking from a pool of blocks as it used to place it. This caused it to only use pool entries above the placement chance threshold. (E.g. a flower pool with a 0.15 chance to place will only use the first 0.15 of the pool of flowers since the RNG is the same) - Removed `zoom`, `verticalZoom` and `varianceZoom` properties from decorators. Zooms can be done inside the individual styles instead. - WIP Tab Completion (Create command only rn) Dev notes: It's very important from now on that in decorators, the X and Z remain switched when getting noise so that the result of the noise is not exactly the same as the noise that choose if the decor should be placed or not --- .../command/world/CommandIrisCreate.java | 77 ++++++++++++++++--- .../command/world/CommandIrisPregen.java | 8 +- .../volmit/iris/object/DecorationPart.java | 4 + .../com/volmit/iris/object/IrisDecorator.java | 38 +++------ src/main/java/com/volmit/iris/util/V.java | 4 + 5 files changed, 89 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java index d4bf11fbb..4d7d0a15a 100644 --- a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java @@ -2,6 +2,7 @@ package com.volmit.iris.manager.command.world; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; +import com.volmit.iris.generator.IrisWorldManager; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.link.MultiverseCoreLink; import com.volmit.iris.nms.INMS; @@ -15,6 +16,8 @@ import org.bukkit.World; import org.bukkit.WorldCreator; import java.io.File; +import java.util.Locale; +import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReferenceArray; @@ -31,7 +34,56 @@ public class CommandIrisCreate extends MortarCommand @Override public void addTabOptions(MortarSender sender, String[] args, KList list) { + if (args.length == 0 || args[args.length - 1].equals("")) { //They are about to type a new argument + list.addAll(getBase(args)); + return; + } + String[] split = args[args.length - 1].split("\\Q=\\E"); + if (split.length == 0) { //They haven't typed the = yet so just keep the options there + list.addAll(getBase(args)); + return; + } + + String pre = split[0].toLowerCase(); + + if (pre.equals("type")) { + for (String s : Iris.proj.getListing(true).keySet()) { + list.add("type=" + s); + } + if (!list.contains("type=overworld")) { + list.contains("type=overworld"); + } + } else if (pre.equals("seed")) { + list.add("seed=1337"); + list.add("seed=" + new Random().nextInt()); + list.add("seed=random"); + } else if (pre.equals("pregen")) { + list.add("500"); + list.add("1000"); + list.add("2000"); + list.add("5k"); + list.add("10k"); + list.add("25k"); + } + } + + private KList getBase(String[] args) { + KList list = new KList<>(); + boolean seed = true; + boolean type = true; + boolean pregen = true; + + for (String s : args) { + if (s.toLowerCase().startsWith("seed=")) seed = false; + else if (s.toLowerCase().startsWith("type=")) type = false; + else if (s.toLowerCase().startsWith("pregen=")) pregen = false; + } + + if (seed) list.add("seed="); + if (type) list.add("type="); + if (pregen) list.add("pregen="); + return list; } @Override @@ -42,17 +94,17 @@ public class CommandIrisCreate extends MortarCommand sender.sendMessage("/iris create [type=overworld] [seed=1337] [pregen=5000]"); return true; } - + Random random = new Random(); String worldName = args[0]; String type = IrisSettings.get().getGenerator().getDefaultWorldType(); - long seed = 1337; - AtomicInteger pregen = new AtomicInteger(0); + long seed = random.nextLong(); //Random seed when creating a world + AtomicInteger pregen = new AtomicInteger(256); boolean multiverse = Iris.linkMultiverseCore.supported(); for(String i : args) { type = i.startsWith("type=") ? i.split("\\Q=\\E")[1] : type; - seed = i.startsWith("seed=") ? Long.valueOf(i.split("\\Q=\\E")[1]) : seed; + seed = i.startsWith("seed=") ? (i.split("\\Q=\\E")[1].equalsIgnoreCase("random") ? random.nextLong() : Long.valueOf(i.split("\\Q=\\E")[1])) : seed; pregen.set(i.startsWith("pregen=") ? getVal(i.split("\\Q=\\E")[1]) : pregen.get()); } @@ -61,8 +113,6 @@ public class CommandIrisCreate extends MortarCommand IrisDimension dim; File folder = new File(worldName); - - Runnable onDone = () -> { sender.sendMessage(worldName + " Spawn Area generated."); @@ -88,10 +138,12 @@ public class CommandIrisCreate extends MortarCommand if(pregen.get() > 0) { b.set(false); - sender.sendMessage("Pregenerating " + worldName + " " + pregen + " x " + pregen); + int size = pregen.get(); + size *= 2; + sender.sendMessage("Pregenerating " + worldName + " " + size + " x " + size); sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel"); - new Pregenerator(world.get(), pregen.get(), () -> + new Pregenerator(world.get(), size, () -> { b.set(true); }); @@ -119,7 +171,6 @@ public class CommandIrisCreate extends MortarCommand }; - if(multiverse) { dim = IrisDataManager.loadAnyDimension(type); @@ -148,7 +199,6 @@ public class CommandIrisCreate extends MortarCommand world.set(Bukkit.getWorld(worldName)); onDone.run(); } - else { if(folder.exists()) @@ -195,7 +245,12 @@ public class CommandIrisCreate extends MortarCommand } }); - world.set(INMS.get().createWorld(wc)); + World w = INMS.get().createWorld(wc); + world.set(w); + + J.a(() -> { + new Pregenerator(w, pregen.get() * 2); + }); done.set(true); }); diff --git a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java index fc7106922..69aba6b7f 100644 --- a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java @@ -104,7 +104,7 @@ public class CommandIrisPregen extends MortarCommand } } try { - new Pregenerator(world, getVal(args[0])); + new Pregenerator(world, getVal(args[0]) * 2); } catch (NumberFormatException e){ sender.sendMessage("Invalid argument in command"); return true; @@ -120,7 +120,7 @@ public class CommandIrisPregen extends MortarCommand else { if (args.length < 1){ - sender.sendMessage("Please specify the size of the pregen and the name of the world. E.g. /ir pregen 5k world"); + sender.sendMessage("Please specify the radius of the pregen and the name of the world. E.g. /ir pregen 5k world"); return true; } if (args.length < 2){ @@ -129,7 +129,7 @@ public class CommandIrisPregen extends MortarCommand } World world = Bukkit.getWorld(args[1]); try { - new Pregenerator(world, getVal(args[0])); + new Pregenerator(world, getVal(args[0]) * 2); } catch (NumberFormatException e){ sender.sendMessage("Invalid argument in command"); return true; @@ -166,6 +166,6 @@ public class CommandIrisPregen extends MortarCommand @Override protected String getArgsUsage() { - return "[width]"; + return "[radius]"; } } diff --git a/src/main/java/com/volmit/iris/object/DecorationPart.java b/src/main/java/com/volmit/iris/object/DecorationPart.java index ea261c788..044759299 100644 --- a/src/main/java/com/volmit/iris/object/DecorationPart.java +++ b/src/main/java/com/volmit/iris/object/DecorationPart.java @@ -18,6 +18,10 @@ public enum DecorationPart @DontObfuscate SEA_SURFACE, + @Desc("Targets the sea floor (entire placement must be bellow sea level)") + @DontObfuscate + SEA_FLOOR, + @Desc("Decorates on cave & carving ceilings or underside of overhangs") @DontObfuscate CEILING, diff --git a/src/main/java/com/volmit/iris/object/IrisDecorator.java b/src/main/java/com/volmit/iris/object/IrisDecorator.java index 3c929821d..e4fbb5d7c 100644 --- a/src/main/java/com/volmit/iris/object/IrisDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisDecorator.java @@ -54,22 +54,6 @@ public class IrisDecorator @Desc("The maximum repeat stack height") private int stackMax = 1; - @MinNumber(0.0001) - @DontObfuscate - @Desc("The zoom is for zooming in or out wispy dispersions. Makes patches bigger the higher this zoom value is") - private double zoom = 1; - - @MinNumber(0.0001) - @DontObfuscate - @Desc("The zoom is for zooming in or out variance. Makes patches have more or less of one type.") - private double varianceZoom = 1; - - @DependsOn({"stackMin", "stackMax"}) - @MinNumber(0.0001) - @DontObfuscate - @Desc("The vertical zoom is for wispy stack heights. Zooming this in makes stack heights more slowly change over a distance") - private double verticalZoom = 1; - @Required @MinNumber(0) @MaxNumber(1) @@ -101,7 +85,7 @@ public class IrisDecorator return stackMin; } - return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / verticalZoom, z / verticalZoom); + return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / heightVariance.getZoom(), z / heightVariance.getZoom()); } public CNG getHeightGenerator(RNG rng, IrisDataManager data) @@ -123,7 +107,7 @@ public class IrisDecorator variance.create( rng.nextParallelRNG((int) (getBlockData(data).size()))) - .scale(1D / varianceZoom)); + .scale(1D / variance.getZoom())); } public KList add(String b) @@ -140,8 +124,8 @@ public class IrisDecorator return null; } - double xx = x / getZoom(); - double zz = z / getZoom(); + double xx = x / style.getZoom(); + double zz = z / style.getZoom(); if(getGenerator(rng, data).fitDouble(0D, 1D, xx, zz) <= chance) { @@ -150,7 +134,7 @@ public class IrisDecorator return getBlockData(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockData(data), xx, zz); + return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx); //X and Z must be switched } return null; @@ -169,8 +153,8 @@ public class IrisDecorator if(!getVarianceGenerator(rng, data).isStatic()) { - xx = x / getZoom(); - zz = z / getZoom(); + xx = x / style.getZoom(); + zz = z / style.getZoom(); } if(getBlockData(data).size() == 1) @@ -178,7 +162,7 @@ public class IrisDecorator return getBlockData(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockData(data), xx, zz).clone(); + return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx).clone(); //X and Z must be switched } public BlockData getBlockDataForTop(IrisBiome b, RNG rng, double x, double z, IrisDataManager data) @@ -188,8 +172,8 @@ public class IrisDecorator return null; } - double xx = x / getZoom(); - double zz = z / getZoom(); + double xx = x / style.getZoom(); + double zz = z / style.getZoom(); if(getGenerator(rng, data).fitDouble(0D, 1D, xx, zz) <= chance) { @@ -198,7 +182,7 @@ public class IrisDecorator return getBlockDataTops(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), xx, zz); + return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), zz, xx); //X and Z must be switched } return null; diff --git a/src/main/java/com/volmit/iris/util/V.java b/src/main/java/com/volmit/iris/util/V.java index e99f2e9cc..7bde92bdf 100644 --- a/src/main/java/com/volmit/iris/util/V.java +++ b/src/main/java/com/volmit/iris/util/V.java @@ -106,6 +106,10 @@ public class V return null; } + public Object getSelf() { + return o; + } + public Object invoke(String method, Object... parameters) { KList> par = new KList>(); From 7652aca40670514e93373dbf66c21e3039c17fce Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Sat, 10 Jul 2021 03:34:11 +1200 Subject: [PATCH 2/5] Decorator Updates and Fixes - Season 2 - Added SEA_FLOOR type to decorators which will only place bellow sea level/in water - Implemented CEILING type to decorators, which will allow stacked blocks to place from the top down - Fixed height variance not being implemented properly. The height of stacked blocks is now correct Dev notes: This WILL require updates to the overworld pack as fixing some of the bugs here made some workarounds in the overworld pack kinda break --- .../volmit/iris/generator/IrisComplex.java | 3 ++ .../actuator/IrisDecorantActuator.java | 37 +++++++++------ .../decorator/IrisCeilingDecorator.java | 7 +-- .../decorator/IrisSeaFloorDecorator.java | 45 +++++++++++++++++++ .../decorator/IrisSeaSurfaceDecorator.java | 5 +-- .../decorator/IrisShoreLineDecorator.java | 3 +- .../decorator/IrisSurfaceDecorator.java | 6 +-- .../com/volmit/iris/object/IrisDecorator.java | 8 ++-- 8 files changed, 85 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java diff --git a/src/main/java/com/volmit/iris/generator/IrisComplex.java b/src/main/java/com/volmit/iris/generator/IrisComplex.java index ce1e1580d..cfa876587 100644 --- a/src/main/java/com/volmit/iris/generator/IrisComplex.java +++ b/src/main/java/com/volmit/iris/generator/IrisComplex.java @@ -52,6 +52,7 @@ public class IrisComplex implements DataProvider private ProceduralStream terrainCaveSurfaceDecoration; private ProceduralStream terrainCaveCeilingDecoration; private ProceduralStream seaSurfaceDecoration; + private ProceduralStream seaFloorDecoration; private ProceduralStream shoreSurfaceDecoration; private ProceduralStream rockStream; private ProceduralStream fluidStream; @@ -191,6 +192,8 @@ public class IrisComplex implements DataProvider .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SHORE_LINE)); seaSurfaceDecoration = trueBiomeStream .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_SURFACE)); + seaFloorDecoration = trueBiomeStream + .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_FLOOR)); trueHeightStream = ProceduralStream.of((x, z) -> { int rx = (int) Math.round(engine.modifyX(x)); int rz = (int) Math.round(engine.modifyZ(z)); diff --git a/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java index 262141c4c..5753bfebf 100644 --- a/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java +++ b/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java @@ -1,5 +1,6 @@ package com.volmit.iris.generator.actuator; +import com.volmit.iris.generator.decorator.IrisSeaFloorDecorator; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; @@ -28,6 +29,8 @@ public class IrisDecorantActuator extends EngineAssignedActuator @Getter private final EngineDecorator seaSurfaceDecorator; @Getter + private final EngineDecorator seaFloorDecorator; + @Getter private final EngineDecorator shoreLineDecorator; private final boolean shouldRay; @@ -39,6 +42,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator ceilingDecorator = new IrisCeilingDecorator(getEngine()); seaSurfaceDecorator = new IrisSeaSurfaceDecorator(getEngine()); shoreLineDecorator = new IrisShoreLineDecorator(getEngine()); + seaFloorDecorator = new IrisSeaFloorDecorator(getEngine()); } @Override @@ -49,9 +53,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator } PrecisionStopwatch p = PrecisionStopwatch.start(); - boolean solid; - int emptyFor = 0; - int lastSolid = 0; + int j, realX, realZ, height; IrisBiome biome, cave; @@ -59,6 +61,9 @@ public class IrisDecorantActuator extends EngineAssignedActuator { for(j = 0; j < output.getDepth(); j++) { + boolean solid; + int emptyFor = 0; + int lastSolid = 0; realX = (int) Math.round(modX(x + i)); realZ = (int) Math.round(modZ(z + j)); height = (int) Math.round(getComplex().getHeightStream().get(realX, realZ)); @@ -77,10 +82,16 @@ public class IrisDecorantActuator extends EngineAssignedActuator realZ, (int) Math.round(modZ(z + j+1)), (int) Math.round(modZ(z + j-1)), output, biome, height, getEngine().getHeight() - height); } - + else if (height == getDimension().getFluidHeight() + 1) + { + getSeaSurfaceDecorator().decorate(i, j, + realX, (int) Math.round(modX(x + i+1)), (int) Math.round(modX(x + i-1)), + realZ, (int) Math.round(modZ(z + j+1)), (int) Math.round(modZ(z + j-1)), + output, biome, height, getEngine().getHeight() - getDimension().getFluidHeight()); + } else if(height < getDimension().getFluidHeight()) { - getSeaSurfaceDecorator().decorate(i, j, realX, realZ, output, biome, getDimension().getFluidHeight(), getEngine().getHeight() - getDimension().getFluidHeight()); + getSeaFloorDecorator().decorate(i, j, realX, realZ, output, biome, height + 1, getDimension().getFluidHeight()); } getSurfaceDecorator().decorate(i, j, realX, realZ, output, biome, height, getEngine().getHeight() - height); @@ -93,18 +104,16 @@ public class IrisDecorantActuator extends EngineAssignedActuator if(solid) { + if (emptyFor > 0) { + getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, emptyFor); + getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid, emptyFor); + emptyFor = 0; + } lastSolid = k; } - - else { - emptyFor++; - } - - if(solid && emptyFor > 0) + else { - getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid, emptyFor); - getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, emptyFor); - emptyFor = 0; + emptyFor++; } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java index 65e08bcab..2b2b3dd54 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java @@ -22,16 +22,17 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { if(!decorator.isStacking()) { - data.set(x, height-1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); + data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); } else { - int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max); + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); + stack = Math.min(max + 1, stack); for(int i = 0; i < stack; i++) { - data.set(x, height-1-i, z, i == stack-1 ? decorator.getBlockDataForTop(biome, getRng(), realX+i, realZ-i, getData()) : decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData())); + data.set(x, height-i, z, i == 0 ? decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()) : decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java new file mode 100644 index 000000000..d260c26c2 --- /dev/null +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java @@ -0,0 +1,45 @@ +package com.volmit.iris.generator.decorator; + +import com.volmit.iris.Iris; +import com.volmit.iris.object.DecorationPart; +import com.volmit.iris.object.IrisBiome; +import com.volmit.iris.object.IrisDecorator; +import com.volmit.iris.scaffold.cache.Cache; +import com.volmit.iris.scaffold.engine.Engine; +import com.volmit.iris.scaffold.hunk.Hunk; +import org.bukkit.block.data.BlockData; + +public class IrisSeaFloorDecorator extends IrisEngineDecorator +{ + public IrisSeaFloorDecorator(Engine engine) { + super(engine, "Sea Floor", DecorationPart.SEA_FLOOR); + } + + @Override + public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { + if(height <= getDimension().getFluidHeight()) { + + IrisDecorator decorator = getDecorator(biome, realX, realZ); + + if(decorator != null) + { + if(!decorator.isStacking()) + { + data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); + } + else + { + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); + stack = Math.min(stack, getDimension().getFluidHeight() - height + 2); + //Iris.info("Stack at " + realX + "," + realZ + " is " + stack); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + for(int i = 0; i < stack; i++) + { + data.set(x, height+i, z, i == stack-1 ? top : fill); + } + } + } + } + } +} diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java index 84519b8c5..b3e59ef3a 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java @@ -16,7 +16,7 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { - if(height < getDimension().getFluidHeight()) { + if(height > getDimension().getFluidHeight()) { { IrisDecorator decorator = getDecorator(biome, realX, realZ); @@ -26,10 +26,9 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator { data.set(x, getDimension().getFluidHeight()+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); } - else { - int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max); + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); for(int i = 0; i < stack; i++) { diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java index b3acca707..0d9633e46 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java @@ -32,10 +32,9 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator { data.set(x, height+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); } - else { - int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max); + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); for(int i = 0; i < stack; i++) { diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java index 00461050b..3d2c01ad8 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java @@ -62,14 +62,14 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator data.set(x, height+1, z, bd); } - - else { + else + { if (height < getDimension().getFluidHeight()) { max = getDimension().getFluidHeight() - height; } - int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max); + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); for(int i = 0; i < stack; i++) { diff --git a/src/main/java/com/volmit/iris/object/IrisDecorator.java b/src/main/java/com/volmit/iris/object/IrisDecorator.java index e4fbb5d7c..4d479b1aa 100644 --- a/src/main/java/com/volmit/iris/object/IrisDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisDecorator.java @@ -85,7 +85,7 @@ public class IrisDecorator return stackMin; } - return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / heightVariance.getZoom(), z / heightVariance.getZoom()); + return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / heightVariance.getZoom(), z / heightVariance.getZoom()) + 1; } public CNG getHeightGenerator(RNG rng, IrisDataManager data) @@ -134,7 +134,7 @@ public class IrisDecorator return getBlockData(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx); //X and Z must be switched + return getVarianceGenerator(rng, data).fit(getBlockData(data), z, x); //X and Z must be switched } return null; @@ -162,7 +162,7 @@ public class IrisDecorator return getBlockData(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx).clone(); //X and Z must be switched + return getVarianceGenerator(rng, data).fit(getBlockData(data), z, x).clone(); //X and Z must be switched } public BlockData getBlockDataForTop(IrisBiome b, RNG rng, double x, double z, IrisDataManager data) @@ -182,7 +182,7 @@ public class IrisDecorator return getBlockDataTops(data).get(0); } - return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), zz, xx); //X and Z must be switched + return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), z, x); //X and Z must be switched } return null; From 4a5794ad5fc264116ca03af438da9bdb72af3bf0 Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Sat, 10 Jul 2021 14:26:33 +1200 Subject: [PATCH 3/5] Fixed weight not being used in decorator palettes --- src/main/java/com/volmit/iris/object/IrisDecorator.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/object/IrisDecorator.java b/src/main/java/com/volmit/iris/object/IrisDecorator.java index 4d479b1aa..60b92d372 100644 --- a/src/main/java/com/volmit/iris/object/IrisDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisDecorator.java @@ -198,7 +198,9 @@ public class IrisDecorator BlockData bx = i.getBlockData(data); if(bx != null) { - blockData.add(bx); + for (int n = 0; n < i.getWeight(); n++) { + blockData.add(bx); + } } } @@ -216,7 +218,9 @@ public class IrisDecorator BlockData bx = i.getBlockData(data); if(bx != null) { - blockDataTops.add(bx); + for (int n = 0; n < i.getWeight(); n++) { + blockDataTops.add(bx); + } } } From 13a5482f91c482f9ba37d87cad86a1794708944c Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Sat, 10 Jul 2021 17:33:32 +1200 Subject: [PATCH 4/5] Added Top Threshold option to decorators - Added topThreshold option to decorators. Allows stacked blocks to start using the top palette for x percent of the stack --- .../iris/generator/decorator/IrisCeilingDecorator.java | 6 +++++- .../generator/decorator/IrisSeaFloorDecorator.java | 7 ++++--- .../generator/decorator/IrisSeaSurfaceDecorator.java | 5 ++++- .../generator/decorator/IrisShoreLineDecorator.java | 6 +++++- .../iris/generator/decorator/IrisSurfaceDecorator.java | 10 ++++------ .../java/com/volmit/iris/object/IrisDecorator.java | 7 +++++++ 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java index 2b2b3dd54..7997f8d4f 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java @@ -30,9 +30,13 @@ public class IrisCeilingDecorator extends IrisEngineDecorator int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); stack = Math.min(max + 1, stack); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + for(int i = 0; i < stack; i++) { - data.set(x, height-i, z, i == 0 ? decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()) : decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); + double threshold = (((double)i) / (double)(stack - 1)); + data.set(x, height-i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java index d260c26c2..492add8ae 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaFloorDecorator.java @@ -1,6 +1,5 @@ package com.volmit.iris.generator.decorator; -import com.volmit.iris.Iris; import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDecorator; @@ -31,12 +30,14 @@ public class IrisSeaFloorDecorator extends IrisEngineDecorator { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); stack = Math.min(stack, getDimension().getFluidHeight() - height + 2); - //Iris.info("Stack at " + realX + "," + realZ + " is " + stack); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + for(int i = 0; i < stack; i++) { - data.set(x, height+i, z, i == stack-1 ? top : fill); + double threshold = ((double)i) / (stack - 1); + data.set(x, height+i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java index b3e59ef3a..5933e937b 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java @@ -30,9 +30,12 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); for(int i = 0; i < stack; i++) { - data.set(x, getDimension().getFluidHeight()+1+i, z, i == stack-1 ? decorator.getBlockDataForTop(biome, getRng(), realX+i, realZ-i, getData()) : decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData())); + double threshold = ((double)i) / (stack - 1); + data.set(x, getDimension().getFluidHeight()+1+i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java index 0d9633e46..d1ae3dd42 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisShoreLineDecorator.java @@ -36,9 +36,13 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + for(int i = 0; i < stack; i++) { - data.set(x, height+1+i, z, i == stack-1 ? decorator.getBlockDataForTop(biome, getRng(), realX+i, realZ-i, getData()) : decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData())); + double threshold = ((double)i) / (stack - 1); + data.set(x, height+1+i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java index 3d2c01ad8..b3fea78ca 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSurfaceDecorator.java @@ -70,15 +70,13 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator } int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); for(int i = 0; i < stack; i++) { - bd = i == stack-1 ? decorator.getBlockDataForTop(biome, getRng(), realX+i, realZ-i, getData()) : decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData()); - - if(bd == null && i == stack-1) - { - bd = decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData()); - } + double threshold = ((double)i) / (stack - 1); + bd = threshold >= decorator.getTopThreshold() ? top : fill; if(bd == null) { diff --git a/src/main/java/com/volmit/iris/object/IrisDecorator.java b/src/main/java/com/volmit/iris/object/IrisDecorator.java index 60b92d372..00cc6e8ac 100644 --- a/src/main/java/com/volmit/iris/object/IrisDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisDecorator.java @@ -72,6 +72,13 @@ public class IrisDecorator @Desc("The palette of blocks used at the very top of a 'stackMax' of higher than 1. For example, bamboo tops.") private KList topPalette = new KList(); + @DependsOn("topPalette") + @MinNumber(0.01) + @MaxNumber(1.0) + @DontObfuscate + @Desc("When the stack passes the top threshold, the top palette will start being used instead of the normal palette.") + private double topThreshold = 1.0; + private final transient AtomicCache layerGenerator = new AtomicCache<>(); private final transient AtomicCache varianceGenerator = new AtomicCache<>(); private final transient AtomicCache heightGenerator = new AtomicCache<>(); From fb0ff734d7f47a61f947ce610f0f26521e0d4890 Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Sat, 10 Jul 2021 22:49:25 +1200 Subject: [PATCH 5/5] You didn't see anything... --- .../actuator/IrisDecorantActuator.java | 2 +- .../decorator/IrisCeilingDecorator.java | 2 +- .../decorator/IrisSeaSurfaceDecorator.java | 34 ++++++++----------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java index 5753bfebf..7b766b2cc 100644 --- a/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java +++ b/src/main/java/com/volmit/iris/generator/actuator/IrisDecorantActuator.java @@ -106,7 +106,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator { if (emptyFor > 0) { getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, emptyFor); - getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid, emptyFor); + getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid - 1, emptyFor); emptyFor = 0; } lastSolid = k; diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java index 7997f8d4f..3e98b98b3 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisCeilingDecorator.java @@ -36,7 +36,7 @@ public class IrisCeilingDecorator extends IrisEngineDecorator for(int i = 0; i < stack; i++) { double threshold = (((double)i) / (double)(stack - 1)); - data.set(x, height-i, z, threshold >= decorator.getTopThreshold() ? top : fill); + data.set(x, height - i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } } diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java index 5933e937b..e174563ee 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisSeaSurfaceDecorator.java @@ -16,28 +16,24 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { - if(height > getDimension().getFluidHeight()) { + IrisDecorator decorator = getDecorator(biome, realX, realZ); + + if(decorator != null) + { + if(!decorator.isStacking()) { - IrisDecorator decorator = getDecorator(biome, realX, realZ); + data.set(x, getDimension().getFluidHeight()+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); + } + else + { + int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - if(decorator != null) + BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); + BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + for(int i = 0; i < stack; i++) { - if(!decorator.isStacking()) - { - data.set(x, getDimension().getFluidHeight()+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData())); - } - else - { - int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - - BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); - BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); - for(int i = 0; i < stack; i++) - { - double threshold = ((double)i) / (stack - 1); - data.set(x, getDimension().getFluidHeight()+1+i, z, threshold >= decorator.getTopThreshold() ? top : fill); - } - } + double threshold = ((double)i) / (stack - 1); + data.set(x, getDimension().getFluidHeight() + 1 + i, z, threshold >= decorator.getTopThreshold() ? top : fill); } } }