Grow speleothems from decorators and keep them supported

Dripstone and sulfur spikes are placed as oriented, thickness-graded
columns by the surface and ceiling decorators through a shared
IrisSpeleothems helper, replacing the ad hoc dripstone fixups, and the
stacking path is unified for both directions. The perfection modifier
renormalizes a spike whose support a pool replaced, dropping the
unsupported run and re-tipping what remains. Surface sturdiness is asked
per face now, so a downward spike tests the ceiling it hangs from.
This commit is contained in:
Brian Neumann-Fopiano committed 2026-09-03 05:03:14 -04:00
1 parent fd66b41bad
commit 5053a644c7
9 files changed
+839 -127

No files matched your search

@@ -33,7 +33,7 @@ import net.minecraft.world.level.EmptyBlockGetter;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.PointedDripstoneBlock;
import net.minecraft.world.level.block.SpeleothemBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.SpeleothemThickness;
@@ -476,8 +476,8 @@ public final class ModdedBlockResolution {
public static boolean isUpdatable(BlockState state) {
return isStorage(state)
|| (state.getBlock() instanceof PointedDripstoneBlock
&& state.getValue(PointedDripstoneBlock.THICKNESS) == SpeleothemThickness.TIP);
|| (state.getBlock() instanceof SpeleothemBlock
&& state.getValue(SpeleothemBlock.THICKNESS) == SpeleothemThickness.TIP);
}
public static boolean isFoliage(BlockState state) {
@@ -95,8 +95,8 @@ public final class ModdedDecoratorHooks implements DecoratorPlatformHooks.FaceFi
}
@Override
public boolean canGoOn(PlatformBlockState surface) {
return isFaceSturdy((BlockState) surface.nativeHandle(), Direction.UP);
public boolean canGoOn(PlatformBlockState surface, boolean upward) {
return isFaceSturdy((BlockState) surface.nativeHandle(), upward ? Direction.UP : Direction.DOWN);
}
private static boolean isFaceSturdy(BlockState state, Direction face) {