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 f725ee47f..199fc83ff 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java @@ -23,6 +23,7 @@ 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; @@ -100,14 +101,13 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { } private BlockData fixFaces(BlockData b, int x, int y, int z) { - Material mat = b.getMaterial(); - if(mat == Material.VINE || mat == Material.GLOW_LICHEN) { + 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, y, z).getMaterial(); + 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()); 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 07b5e52c4..a5909c5c8 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java @@ -25,12 +25,14 @@ import com.volmit.iris.engine.object.InferredType; 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.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 { @@ -73,8 +75,8 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } if(decorator.getForceBlock() != null) - data.set(x, height, z, decorator.getForceBlock().getBlockData(getData())); - data.set(x, height + 1, z, bd); + data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), x, height, z)); + data.set(x, height + 1, z, fixFaces(bd, x, height, z)); } else { if(height < getDimension().getFluidHeight()) { max = getDimension().getFluidHeight(); @@ -140,4 +142,24 @@ 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/src/main/java/com/volmit/iris/util/data/B.java b/src/main/java/com/volmit/iris/util/data/B.java index fe3ab6381..728977a7f 100644 --- a/src/main/java/com/volmit/iris/util/data/B.java +++ b/src/main/java/com/volmit/iris/util/data/B.java @@ -201,7 +201,8 @@ public class B { TORCH, SOUL_TORCH, GLOW_LICHEN, - VINE + VINE, + SCULK_VEIN }).forEach((i) -> b.add(i.ordinal())); b.addAll(foliageCache); @@ -674,4 +675,11 @@ public class B { public static void registerCustomBlockData(String namespace, String key, BlockData blockData) { custom.put(namespace + ":" + key, blockData); } + + public static boolean isVineBlock(BlockData data) { + return switch(data.getMaterial()) { + case VINE, SCULK_VEIN, GLOW_LICHEN -> true; + default -> false; + }; + } }