diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java index 362a3ea69..5c8c31945 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java @@ -23,13 +23,11 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorationPart; import com.volmit.iris.engine.object.IrisDecorator; -import com.volmit.iris.util.data.B; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.hunk.Hunk; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.type.PointedDripstone; public class IrisCeilingDecorator extends IrisEngineDecorator { @@ -43,7 +41,7 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { IrisDecorator decorator = getDecorator(biome, realX, realZ); if (decorator != null) { if (!decorator.isStacking()) { - data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), realX, height, realZ)); + data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), data, x, z, realX, height, realZ)); } else { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); if (decorator.isScaleStack()) { @@ -97,24 +95,4 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { } } } - - private BlockData fixFaces(BlockData b, int x, int y, int z) { - if (B.isVineBlock(b)) { - MultipleFacing data = (MultipleFacing) b.clone(); - boolean found = false; - for (BlockFace f : BlockFace.values()) { - if (!f.isCartesian()) - continue; - Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial(); - if (m.isSolid()) { - found = true; - data.setFace(f, m.isSolid()); - } - } - if (!found) - data.setFace(BlockFace.UP, true); - return data; - } - return b; - } } diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java index b41e6522b..8abb56a23 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java @@ -27,8 +27,14 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorationPart; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.B; +import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.math.RNG; import lombok.Getter; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockSupport; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.MultipleFacing; public abstract class IrisEngineDecorator extends EngineAssignedComponent implements EngineDecorator { @@ -65,4 +71,40 @@ public abstract class IrisEngineDecorator extends EngineAssignedComponent implem return null; } + + protected BlockData fixFaces(BlockData b, Hunk hunk, int rX, int rZ, int x, int y, int z) { + if (B.isVineBlock(b)) { + MultipleFacing data = (MultipleFacing) b.clone(); + data.getFaces().forEach(f -> data.setFace(f, false)); + + boolean found = false; + for (BlockFace f : BlockFace.values()) { + if (!f.isCartesian()) + continue; + int yy = y + f.getModY(); + + BlockData r = getEngine().getMantle().get(x + f.getModX(), yy, z + f.getModZ()); + if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) { + found = true; + data.setFace(f, true); + continue; + } + + int xx = rX + f.getModX(); + int zz = rZ + f.getModZ(); + if (xx < 0 || xx > 15 || zz < 0 || zz > 15 || yy < 0 || yy > hunk.getHeight()) + continue; + + r = hunk.get(xx, yy, zz); + if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) { + found = true; + data.setFace(f, true); + } + } + if (!found) + data.setFace(BlockFace.DOWN, true); + return data; + } + return b; + } } diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java index 49e636220..73f81f0fe 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java @@ -32,7 +32,6 @@ 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.MultipleFacing; import org.bukkit.block.data.type.PointedDripstone; public class IrisSurfaceDecorator extends IrisEngineDecorator { @@ -68,7 +67,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } if (decorator.getForceBlock() != null) { - data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), x, height, z)); + data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), data, x, z, realX, height, realZ)); } else if (!decorator.isForcePlace()) { if (decorator.getWhitelist() != null && decorator.getWhitelist().stream().noneMatch(d -> d.getBlockData(getData()).equals(bdx))) { return; @@ -91,7 +90,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } if (B.isAir(data.get(x, height + 1, z))) { - data.set(x, height + 1, z, fixFaces(bd, x, height + 1, z)); + data.set(x, height + 1, z, fixFaces(bd, data, x, z, realX, height + 1, realZ)); } } else { if (height < getDimension().getFluidHeight()) { @@ -158,24 +157,4 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } } } - - private BlockData fixFaces(BlockData b, int x, int y, int z) { - if (B.isVineBlock(b)) { - MultipleFacing data = (MultipleFacing) b.clone(); - boolean found = false; - for (BlockFace f : BlockFace.values()) { - if (!f.isCartesian()) - continue; - Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial(); - if (m.isSolid()) { - found = true; - data.setFace(f, m.isSolid()); - } - } - if (!found) - data.setFace(BlockFace.UP, true); - return data; - } - return b; - } } diff --git a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java index 8fe8d1405..c5a5f9e5f 100644 --- a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java +++ b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java @@ -211,14 +211,6 @@ public class IrisCarveModifier extends EngineAssignedModifier { biome.setInferredType(InferredType.CAVE); - for (IrisDecorator i : biome.getDecorators()) { - if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) { - decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness()); - } else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) { - decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness()); - } - } - KList blocks = biome.generateLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex()); for (int i = 0; i < zone.floor - 1; i++) { @@ -260,6 +252,14 @@ public class IrisCarveModifier extends EngineAssignedModifier { output.set(rx, zone.ceiling + i + 1, rz, b); } } + + for (IrisDecorator i : biome.getDecorators()) { + if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) { + decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness()); + } else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) { + decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness()); + } + } } @Data