diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index a93e52b7..b4d9f465 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -1,7 +1,6 @@ package ru.betterend.util.sdf; import java.util.Map; -import java.util.Set; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -11,15 +10,15 @@ import net.minecraft.util.math.Direction; public class PosInfo implements Comparable { private static final BlockState AIR = Blocks.AIR.getDefaultState(); private final Map blocks; - private final Set add; + private final Map add; private final BlockPos pos; private BlockState state; - public static PosInfo create(Map blocks, Set add, BlockPos pos) { + public static PosInfo create(Map blocks, Map add, BlockPos pos) { return new PosInfo(blocks, add, pos); } - private PosInfo(Map blocks, Set add, BlockPos pos) { + private PosInfo(Map blocks, Map add, BlockPos pos) { this.blocks = blocks; this.add = add; this.pos = pos; @@ -37,7 +36,8 @@ public class PosInfo implements Comparable { public BlockState getState(Direction dir) { PosInfo info = blocks.get(pos.offset(dir)); if (info == null) { - return AIR; + info = add.get(pos.offset(dir)); + return info == null ? AIR : info.getState(); } return info.getState(); } @@ -83,6 +83,6 @@ public class PosInfo implements Comparable { public void setBlockPos(BlockPos pos, BlockState state) { PosInfo info = new PosInfo(blocks, add, pos); info.state = state; - add.add(info); + add.put(pos, info); } } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index b2434ef6..6e980188 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -41,7 +41,7 @@ public abstract class SDF { public void fillRecursive(ServerWorldAccess world, BlockPos start, int dx, int dy, int dz) { Map mapWorld = Maps.newHashMap(); - Set addInfo = Sets.newHashSet(); + Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -85,19 +85,22 @@ public abstract class SDF { BlockState state = postProcess.apply(info); BlocksHelper.setWithoutUpdate(world, info.getPos(), state); }); - } - addInfo.forEach((info) -> { - if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - } - }); + infos.clear(); + infos.addAll(addInfo.values()); + Collections.sort(infos); + infos.forEach((info) -> { + if (canReplace.apply(world.getBlockState(info.getPos()))) { + BlockState state = postProcess.apply(info); + BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + } + }); + } } public void fillRecursive(ServerWorldAccess world, BlockPos start) { Map mapWorld = Maps.newHashMap(); - Set addInfo = Sets.newHashSet(); + Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -135,19 +138,22 @@ public abstract class SDF { BlockState state = postProcess.apply(info); BlocksHelper.setWithoutUpdate(world, info.getPos(), state); }); + + infos.clear(); + infos.addAll(addInfo.values()); + Collections.sort(infos); + infos.forEach((info) -> { + if (canReplace.apply(world.getBlockState(info.getPos()))) { + BlockState state = postProcess.apply(info); + BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + } + }); } - - addInfo.forEach((info) -> { - if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - } - }); } public void fillRecursive(StructureWorld world, BlockPos start) { Map mapWorld = Maps.newHashMap(); - Set addInfo = Sets.newHashSet(); + Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -179,14 +185,16 @@ public abstract class SDF { } List infos = new ArrayList(mapWorld.values()); - infos.addAll(addInfo); Collections.sort(infos); infos.forEach((info) -> { BlockState state = postProcess.apply(info); world.setBlock(info.getPos(), state); }); - addInfo.forEach((info) -> { + infos.clear(); + infos.addAll(addInfo.values()); + Collections.sort(infos); + infos.forEach((info) -> { BlockState state = postProcess.apply(info); world.setBlock(info.getPos(), state); }); diff --git a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java index 8fcedc2c..5e61420c 100644 --- a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java @@ -139,7 +139,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { } } - if (info.getStateDown() == AIR) { + if (info.getStateDown().getBlock() != BlockRegistry.MOSSY_GLOWSHROOM_HYMENOPHORE) { info.setBlockPos(info.getPos().down(), BlockRegistry.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockGlowingFur.FACING, Direction.DOWN)); } } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java index 167fae91..845a4ad0 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import java.util.Random; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.Heightmap; @@ -13,6 +15,8 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; public abstract class StructureFeatureBase extends StructureFeature { + protected static final BlockState AIR = Blocks.AIR.getDefaultState(); + public StructureFeatureBase() { super(DefaultFeatureConfig.CODEC); } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java index 88fd448b..648d23c2 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java @@ -5,9 +5,12 @@ import java.util.Random; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import ru.betterend.blocks.BlockMossyGlowshroomCap; +import ru.betterend.blocks.basis.BlockGlowingFur; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.BlockRegistry; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; @@ -107,6 +110,17 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { info.setState(BlockRegistry.MOSSY_GLOWSHROOM_CAP.getDefaultState()); return info.getState(); } + else if (info.getState().getBlock() == BlockRegistry.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (info.getState(dir) == AIR) { + info.setBlockPos(info.getPos().offset(dir), BlockRegistry.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockGlowingFur.FACING, dir)); + } + } + + if (info.getStateDown().getBlock() != BlockRegistry.MOSSY_GLOWSHROOM_HYMENOPHORE) { + info.setBlockPos(info.getPos().down(), BlockRegistry.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockGlowingFur.FACING, Direction.DOWN)); + } + } return info.getState(); }); }