From 21ce09a5b56e0eef277f8deee1170aa503ed83f9 Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Tue, 27 Jul 2021 00:04:17 +1200 Subject: [PATCH] Added scaleStack property to decorators - Added scaleStack to decorators. It allows the size of the stack to scale to the size of the cave, using stackMin and stackMax as a min/max percentage - Fixed stacks missing a block in size when the top block isn't defined - Changed decorator stacks of a single block to place the top block instead of the body - Fixed tab sound playing to other players --- .../iris/engine/actuator/IrisDecorantActuator.java | 5 +++-- .../iris/engine/decorator/IrisCeilingDecorator.java | 10 +++++++++- .../iris/engine/decorator/IrisSeaFloorDecorator.java | 11 ++++++++++- .../engine/decorator/IrisSeaSurfaceDecorator.java | 6 +++++- .../iris/engine/decorator/IrisShoreLineDecorator.java | 5 ++++- .../iris/engine/decorator/IrisSurfaceDecorator.java | 10 +++++++++- .../com/volmit/iris/engine/object/IrisDecorator.java | 9 ++++++--- .../com/volmit/iris/util/plugin/MortarCommand.java | 2 +- 8 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java index 09c84d3cf..24f512354 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java @@ -118,11 +118,12 @@ 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()); } else if (height < getDimension().getFluidHeight()) { - getSeaFloorDecorator().decorate(i, j, realX, realZ, output, biome, height + 1, getDimension().getFluidHeight()); + getSeaFloorDecorator().decorate(i, j, realX, realZ, output, biome, height + 1, getDimension().getFluidHeight() + 1); } getSurfaceDecorator().decorate(i, j, realX, realZ, output, biome, height, getEngine().getHeight() - height); + if (cave != null && cave.getDecorators().isNotEmpty()) { for (int k = height; k > 0; k--) { solid = PREDICATE_SOLID.test(output.get(i, k, j)); @@ -131,7 +132,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator { if (solid) { if (emptyFor > 0) { if (liquid) { - getSeaFloorDecorator().decorate(i, j, realX, realZ, output, cave, k + 1, liquidFor + lastSolid - emptyFor); + getSeaFloorDecorator().decorate(i, j, realX, realZ, output, cave, k + 1, liquidFor + lastSolid - emptyFor + 1); getSeaSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k + liquidFor + 1, emptyFor - liquidFor + lastSolid); } else { getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, lastSolid); diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java index 0c6703d8b..5fc0c7279 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java @@ -44,11 +44,19 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { } } else { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - stack = Math.min(max + 1, stack); + if (decorator.isScaleStack()) { + int maxStack = max - height; + stack = (int) Math.ceil((double)maxStack * ((double)stack / 100)); + } else stack = Math.min(max + 1, stack); BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + if (stack == 1) { + data.set(x, height, z, top); + return; + } + for (int i = 0; i < stack; i++) { if (height - i < 0 || height - i > getEngine().getHeight()) { continue; diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java index 6ddbb59f7..675a10dce 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.decorator; +import com.volmit.iris.Iris; import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.hunk.Hunk; @@ -44,11 +45,19 @@ public class IrisSeaFloorDecorator extends IrisEngineDecorator { } } else { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - stack = Math.min(stack, max - height + 2); + if (decorator.isScaleStack()) { + int maxStack = max - height; + stack = (int)Math.ceil((double)maxStack * ((double)stack / 100)); + } else stack = Math.min(stack, max - height); BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + if (stack == 1) { + data.set(x, height, z, top); + return; + } + for (int i = 0; i < stack; i++) { if (height + i > max || height + i > getEngine().getHeight()) { continue; diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java index a00280bcf..0c3e7217e 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.decorator; +import com.volmit.iris.Iris; import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.hunk.Hunk; @@ -44,7 +45,10 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator { } } else { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - + if (decorator.isScaleStack()) { + int maxStack = max - height; + stack = (int) Math.ceil((double)maxStack * ((double)stack / 100)); + } 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++) { diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java index e54aeb1c3..f68b03581 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java @@ -49,7 +49,10 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator { data.set(x, height + 1, 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(max - height, stack); + if (decorator.isScaleStack()) { + int maxStack = max - height; + stack = (int)Math.ceil((double)maxStack * ((double)stack / 100)); + } else stack = Math.min(max - height, stack); BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java index 04e4bfe8a..1545e67eb 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java @@ -77,10 +77,18 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); - stack = Math.min(height - max, stack); + if (decorator.isScaleStack()) { + int maxStack = max - height; + stack = (int) Math.ceil((double)maxStack * ((double)stack / 100)); + } else stack = Math.min(height - max, stack); BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()); BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData()); + if (stack == 1) { + data.set(x, height, z, top); + return; + } + for (int i = 0; i < stack; i++) { double threshold = ((double) i) / (stack - 1); bd = threshold >= decorator.getTopThreshold() ? top : fill; diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java b/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java index 6b08a5d67..8c512230c 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisDecorator.java @@ -56,17 +56,20 @@ public class IrisDecorator { @DependsOn({"stackMin", "stackMax"}) @MinNumber(1) @MaxNumber(256) // TODO: WARNING HEIGHT - @Desc("The minimum repeat stack height (setting to 3 would stack 3 of on top of each other") private int stackMin = 1; @DependsOn({"stackMin", "stackMax"}) @MinNumber(1) @MaxNumber(256) // TODO: WARNING HEIGHT - @Desc("The maximum repeat stack height") private int stackMax = 1; + @DependsOn({"stackMin", "stackMax"}) + @Desc("Changes stackMin and stackMin from being absolute block heights and instead uses them as a percentage to scale the stack based on the cave height" + + "\n\nWithin a cave, setting them stackMin/max to 50 would make the stack 50% of the cave height") + private boolean scaleStack = false; + @Required @MinNumber(0) @MaxNumber(1) @@ -168,7 +171,7 @@ public class IrisDecorator { public BlockData getBlockDataForTop(IrisBiome b, RNG rng, double x, double z, IrisDataManager data) { if (getBlockDataTops(data).isEmpty()) { - return null; + return getBlockData100(b, rng, x, z, data); } double xx = x / style.getZoom(); diff --git a/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java b/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java index 741b75892..04db9e6f9 100644 --- a/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java +++ b/src/main/java/com/volmit/iris/util/plugin/MortarCommand.java @@ -72,7 +72,7 @@ public abstract class MortarCommand implements ICommand { } if (sender.isPlayer() && IrisSettings.get().getGeneral().isCommandSounds()) { - sender.player().getWorld().playSound(sender.player().getLocation(), Sound.ENTITY_ITEM_FRAME_ROTATE_ITEM, 0.25f, 1.7f); + sender.player().playSound(sender.player().getLocation(), Sound.ENTITY_ITEM_FRAME_ROTATE_ITEM, 0.25f, 1.7f); } return v;