diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index 7c71dc67..a93e52b7 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -1,6 +1,7 @@ package ru.betterend.util.sdf; import java.util.Map; +import java.util.Set; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -10,15 +11,17 @@ 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 BlockPos pos; private BlockState state; - public static PosInfo create(Map blocks, BlockPos pos) { - return new PosInfo(blocks, pos); + public static PosInfo create(Map blocks, Set add, BlockPos pos) { + return new PosInfo(blocks, add, pos); } - private PosInfo(Map blocks, BlockPos pos) { + private PosInfo(Map blocks, Set add, BlockPos pos) { this.blocks = blocks; + this.add = add; this.pos = pos; blocks.put(pos, this); } @@ -55,10 +58,12 @@ public class PosInfo implements Comparable { return getState(Direction.DOWN); } + @Override public int hashCode() { return pos.hashCode(); } + @Override public boolean equals(Object obj) { if (!(obj instanceof PosInfo)) { return false; @@ -74,4 +79,10 @@ public class PosInfo implements Comparable { public BlockPos getPos() { return pos; } + + public void setBlockPos(BlockPos pos, BlockState state) { + PosInfo info = new PosInfo(blocks, add, pos); + info.state = state; + add.add(info); + } } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index f822198b..b2434ef6 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -41,6 +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(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -60,7 +61,7 @@ public abstract class SDF { if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { BlockState state = getBlockState(wpos); - PosInfo.create(mapWorld, wpos).setState(state); + PosInfo.create(mapWorld, addInfo, wpos).setState(state); if (Math.abs(pos.getX()) < dx && Math.abs(pos.getY()) < dy && Math.abs(pos.getZ()) < dz) { add.add(pos); } @@ -85,10 +86,18 @@ public abstract class SDF { 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(ServerWorldAccess world, BlockPos start) { Map mapWorld = Maps.newHashMap(); + Set addInfo = Sets.newHashSet(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -104,7 +113,7 @@ public abstract class SDF { if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { BlockState state = getBlockState(wpos); - PosInfo.create(mapWorld, wpos).setState(state); + PosInfo.create(mapWorld, addInfo, wpos).setState(state); add.add(pos); } } @@ -119,11 +128,6 @@ public abstract class SDF { run &= !ends.isEmpty(); } - mapWorld.forEach((pos, info) -> { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, pos, state); - }); - List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -132,10 +136,18 @@ public abstract class SDF { 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(); Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -151,7 +163,7 @@ public abstract class SDF { if (!blocks.contains(pos)) { if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { BlockState state = getBlockState(wpos); - PosInfo.create(mapWorld, wpos).setState(state); + PosInfo.create(mapWorld, addInfo, wpos).setState(state); add.add(pos); } } @@ -167,10 +179,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) -> { + 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 86535057..8fcedc2c 100644 --- a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java @@ -9,11 +9,13 @@ import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockMossyGlowshroomCap; +import ru.betterend.blocks.basis.BlockGlowingFur; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.BlockRegistry; import ru.betterend.registry.BlockTagRegistry; @@ -130,6 +132,17 @@ public class MossyGlowshroomFeature extends DefaultFeature { 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() == AIR) { + info.setBlockPos(info.getPos().down(), BlockRegistry.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockGlowingFur.FACING, Direction.DOWN)); + } + } return info.getState(); }) .fillRecursive(world, blockPos);