From 91b40a3ae65943f9a1cc60726e2a6a6447fdb927 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Oct 2020 00:23:06 +0300 Subject: [PATCH] Lakugrove structure --- .../blocks/BlockLacugroveSapling.java | 16 +++ ...ing.java => BlockPythadendronSapling.java} | 4 +- .../ru/betterend/blocks/EternalPedestal.java | 1 - .../betterend/blocks/basis/BlockLeaves.java | 9 +- .../render/EternalPedestalItemRenderer.java | 2 - .../ru/betterend/item/EternalCrystal.java | 1 - .../java/ru/betterend/registry/EndBlocks.java | 7 +- .../ru/betterend/registry/EndFeatures.java | 2 +- .../java/ru/betterend/util/SplineHelper.java | 62 +++++++++++ src/main/java/ru/betterend/util/sdf/SDF.java | 97 ++++++++++++++++++ .../betterend/world/biome/BiomeMegalake.java | 3 +- .../world/features/LacugroveFeature.java | 72 ++++++++++++- .../features/MossyGlowshroomFeature.java | 33 +----- .../world/structures/piece/LakePiece.java | 14 ++- .../assets/betterend/lang/en_us.json | 5 +- .../assets/betterend/lang/ru_ru.json | 37 ++++--- .../textures/block/lacugrove_leaves.png | Bin 0 -> 2611 bytes 17 files changed, 301 insertions(+), 64 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java rename src/main/java/ru/betterend/blocks/{BlockMossyPythadendronSapling.java => BlockPythadendronSapling.java} (69%) create mode 100644 src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png diff --git a/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java b/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java new file mode 100644 index 00000000..ed3d3fc4 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java @@ -0,0 +1,16 @@ +package ru.betterend.blocks; + +import net.minecraft.world.gen.feature.Feature; +import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.registry.EndFeatures; + +public class BlockLacugroveSapling extends BlockFeatureSapling { + public BlockLacugroveSapling() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.LACUGROVE.getFeature(); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockMossyPythadendronSapling.java b/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java similarity index 69% rename from src/main/java/ru/betterend/blocks/BlockMossyPythadendronSapling.java rename to src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java index 11682c72..d9af34fa 100644 --- a/src/main/java/ru/betterend/blocks/BlockMossyPythadendronSapling.java +++ b/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java @@ -4,8 +4,8 @@ import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.BlockFeatureSapling; import ru.betterend.registry.EndFeatures; -public class BlockMossyPythadendronSapling extends BlockFeatureSapling { - public BlockMossyPythadendronSapling() { +public class BlockPythadendronSapling extends BlockFeatureSapling { + public BlockPythadendronSapling() { super(); } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index 4e16e64d..4c80074d 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -21,7 +21,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.explosion.Explosion; - import ru.betterend.blocks.basis.BlockSlab; import ru.betterend.blocks.entities.EternalPedestalBlockEntity; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java b/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java index 4cbd06e3..c17e4a73 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java @@ -8,9 +8,11 @@ import net.minecraft.block.LeavesBlock; import net.minecraft.block.MaterialColor; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.interfaces.Patterned; -public class BlockLeaves extends LeavesBlock implements Patterned { +public class BlockLeaves extends LeavesBlock implements Patterned, IRenderTypeable { public BlockLeaves(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES).materialColor(color)); } @@ -35,4 +37,9 @@ public class BlockLeaves extends LeavesBlock implements Patterned { public Identifier statePatternId() { return Patterned.BLOCK_STATES_PATTERN; } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EternalPedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EternalPedestalItemRenderer.java index a9b7320e..bfb64544 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EternalPedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EternalPedestalItemRenderer.java @@ -2,7 +2,6 @@ package ru.betterend.blocks.entities.render; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; - import net.minecraft.block.BlockState; import net.minecraft.block.enums.SlabType; import net.minecraft.client.MinecraftClient; @@ -18,7 +17,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; - import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.entities.EternalPedestalBlockEntity; import ru.betterend.client.render.BeamRenderer; diff --git a/src/main/java/ru/betterend/item/EternalCrystal.java b/src/main/java/ru/betterend/item/EternalCrystal.java index cf4a8227..39c25497 100644 --- a/src/main/java/ru/betterend/item/EternalCrystal.java +++ b/src/main/java/ru/betterend/item/EternalCrystal.java @@ -7,7 +7,6 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.ActionResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - import ru.betterend.blocks.RunedFlavolite; import ru.betterend.registry.EndItems; import ru.betterend.util.PortalFrameHelper; diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 79be2d5e..f1f10d19 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -21,12 +21,13 @@ import ru.betterend.blocks.BlockEndLotusSeed; import ru.betterend.blocks.BlockEndLotusStem; import ru.betterend.blocks.BlockEndstoneDust; import ru.betterend.blocks.BlockGlowingMoss; +import ru.betterend.blocks.BlockLacugroveSapling; import ru.betterend.blocks.BlockMossyGlowshroomCap; import ru.betterend.blocks.BlockMossyGlowshroomHymenophore; import ru.betterend.blocks.BlockMossyGlowshroomSapling; -import ru.betterend.blocks.BlockMossyPythadendronSapling; import ru.betterend.blocks.BlockOre; import ru.betterend.blocks.BlockPath; +import ru.betterend.blocks.BlockPythadendronSapling; import ru.betterend.blocks.BlockTerrain; import ru.betterend.blocks.BlockTerrainPlant; import ru.betterend.blocks.BlockUmbrellaMoss; @@ -75,7 +76,7 @@ public class EndBlocks { public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new BlockGlowingFur(MOSSY_GLOWSHROOM_SAPLING, 16)); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); - public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new BlockMossyPythadendronSapling()); + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new BlockPythadendronSapling()); public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new BlockLeaves(MaterialColor.MAGENTA)); public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.MAGENTA, MaterialColor.PURPLE); @@ -85,6 +86,8 @@ public class EndBlocks { public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new BlockEndLotusFlower()); public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.LIGHT_BLUE, MaterialColor.CYAN); + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new BlockLacugroveSapling()); + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new BlockLeaves(MaterialColor.CYAN)); public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.BROWN, MaterialColor.YELLOW); // Small Plants // diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 3caf4d36..f2385ac3 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -33,7 +33,7 @@ public class EndFeatures { // Trees // public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3); public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2); - public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 3); + public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 4); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4); diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index 4be70918..d407a6b6 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -135,4 +135,66 @@ public class SplineHelper { return false; } } + + public static boolean canGenerate(List spline, float scale, BlockPos start, StructureWorldAccess world, Function canReplace) { + int count = spline.size(); + Vector3f vec = spline.get(0); + Mutable mut = new Mutable(); + float x1 = start.getX() + vec.getX() * scale; + float y1 = start.getY() + vec.getY() * scale; + float z1 = start.getZ() + vec.getZ() * scale; + for (int i = 1; i < count; i++) { + vec = spline.get(i); + float x2 = start.getX() + vec.getX() * scale; + float y2 = start.getY() + vec.getY() * scale; + float z2 = start.getZ() + vec.getZ() * scale; + + for (float py = y1; py < y2; py += 3) { + if (py - start.getY() < 10) continue; + float lerp = (py - y1) / (y2 - y1); + float x = MathHelper.lerp(lerp, x1, x2); + float z = MathHelper.lerp(lerp, z1, z2); + mut.set(x, py, z); + if (!canReplace.apply(world.getBlockState(mut))) { + return false; + } + } + + x1 = x2; + y1 = y2; + z1 = z2; + } + return true; + } + + public static boolean canGenerate(List spline, BlockPos start, StructureWorldAccess world, Function canReplace) { + int count = spline.size(); + Vector3f vec = spline.get(0); + Mutable mut = new Mutable(); + float x1 = start.getX() + vec.getX(); + float y1 = start.getY() + vec.getY(); + float z1 = start.getZ() + vec.getZ(); + for (int i = 1; i < count; i++) { + vec = spline.get(i); + float x2 = start.getX() + vec.getX(); + float y2 = start.getY() + vec.getY(); + float z2 = start.getZ() + vec.getZ(); + + for (float py = y1; py < y2; py += 3) { + if (py - start.getY() < 10) continue; + float lerp = (py - y1) / (y2 - y1); + float x = MathHelper.lerp(lerp, x1, x2); + float z = MathHelper.lerp(lerp, z1, z2); + mut.set(x, py, z); + if (!canReplace.apply(world.getBlockState(mut))) { + return false; + } + } + + x1 = x2; + y1 = y2; + z1 = z2; + } + return true; + } } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index 7bec5f0b..52cf6a92 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -13,6 +13,7 @@ import com.google.common.collect.Sets; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; import net.minecraft.world.ServerWorldAccess; import ru.betterend.util.BlocksHelper; @@ -155,6 +156,102 @@ public abstract class SDF { } } + public void fillArea(ServerWorldAccess world, BlockPos center, Box box) { + Map mapWorld = Maps.newHashMap(); + Map addInfo = Maps.newHashMap(); + + Mutable mut = new Mutable(); + for (int y = (int) box.minY; y <= box.maxY; y++) { + mut.setY(y); + for (int x = (int) box.minX; x <= box.maxX; x++) { + mut.setX(x); + for (int z = (int) box.minZ; z <= box.maxZ; z++) { + mut.setZ(z); + if (canReplace.apply(world.getBlockState(mut))) { + BlockPos fpos = mut.subtract(center); + if (this.getDistance(fpos.getX(), fpos.getY(), fpos.getZ()) < 0) { + PosInfo.create(mapWorld, addInfo, mut.toImmutable()).setState(getBlockState(mut)); + } + } + } + } + } + + List infos = new ArrayList(mapWorld.values()); + if (infos.size() > 0) { + Collections.sort(infos); + infos.forEach((info) -> { + 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 fillRecursiveIgnore(ServerWorldAccess world, BlockPos start, Function ignore) { + Map mapWorld = Maps.newHashMap(); + Map addInfo = Maps.newHashMap(); + Set blocks = Sets.newHashSet(); + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(new BlockPos(0, 0, 0)); + boolean run = true; + + Mutable bPos = new Mutable(); + + while (run) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { + bPos.set(center).move(dir); + BlockPos wpos = bPos.add(start); + BlockState state = world.getBlockState(wpos); + boolean ign = ignore.apply(state); + if (!blocks.contains(bPos) && (ign || canReplace.apply(state))) { + if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { + PosInfo.create(mapWorld, addInfo, wpos).setState(ign ? state : getBlockState(bPos)); + add.add(bPos.toImmutable()); + } + } + } + } + + blocks.addAll(ends); + ends.clear(); + ends.addAll(add); + add.clear(); + + run &= !ends.isEmpty(); + } + + List infos = new ArrayList(mapWorld.values()); + if (infos.size() > 0) { + Collections.sort(infos); + infos.forEach((info) -> { + 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(StructureWorld world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index 6469cf54..145dbd38 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -18,7 +18,8 @@ public class BiomeMegalake extends EndBiome { .setFogDensity(1.75F) .setMusic(EndSounds.MUSIC_MEGALAKE) .setLoop(EndSounds.AMBIENT_MEGALAKE) - .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + //.setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + .setSurface(EndBlocks.END_MOSS) .addStructureFeature(EndStructures.MEGALAKE) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addFeature(EndFeatures.LACUGROVE) diff --git a/src/main/java/ru/betterend/world/features/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/LacugroveFeature.java index 27f198a7..4dc46d5a 100644 --- a/src/main/java/ru/betterend/world/features/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/LacugroveFeature.java @@ -5,13 +5,18 @@ import java.util.Random; import java.util.function.Function; import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; 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.Box; +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.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -19,9 +24,14 @@ import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; public class LacugroveFeature extends DefaultFeature { private static final Function REPLACE; + private static final Function IGNORE; private static final Function POST; @Override @@ -31,14 +41,36 @@ public class LacugroveFeature extends DefaultFeature { float size = MHelper.randRange(15, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - float radius = MHelper.randRange(1.2F, 1.8F, random); + + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { + return false; + } + + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + /*Vector3f center = null; + for (int i = 3; i < 6; i++) { + center = spline.get(i); + float radius = MathHelper.lerp((i - 3F) / 2F, 6.5F, 3.7F) + MHelper.randRange(-0.5F, 0.5F, random); + radius *= (size - 15F) / 20F + 1F; + leavesBall(world, pos.add(center.getX(), center.getY(), center.getZ()), radius, random, noise); + }*/ + float radius = MHelper.randRange(6F, 8F, random); + radius *= (size - 15F) / 20F + 1F; + Vector3f center = spline.get(4); + leavesBall(world, pos.add(center.getX(), center.getY(), center.getZ()), radius, random, noise); + + radius = MHelper.randRange(1.2F, 1.8F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { return EndBlocks.LACUGROVE.bark.getDefaultState(); }); + function.setReplaceFunction(REPLACE); function.setPostProcess(POST); function.fillRecursive(world, pos); + spline = spline.subList(4, 6); + SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.getDefaultState(), pos, REPLACE); + Mutable mut = new Mutable(); int offset = random.nextInt(2); for (int i = 0; i < 100; i++) { @@ -79,12 +111,44 @@ public class LacugroveFeature extends DefaultFeature { return true; } + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.LACUGROVE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); + sphere.fillRecursiveIgnore(world, pos, IGNORE); + //sphere.fillArea(world, pos, new Box(pos).expand(radius)); + + if (radius > 5) { + int count = (int) (radius * 2.5F); + for (int i = 0; i < count; i++) { + BlockPos p = pos.add(random.nextGaussian() * 1, random.nextGaussian() * 1, random.nextGaussian() * 1); + boolean place = true; + for (Direction d: Direction.values()) { + BlockState state = world.getBlockState(p.offset(d)); + if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.isOf(EndBlocks.LACUGROVE_LEAVES)) { + place = false; + break; + } + } + if (place) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LACUGROVE.bark); + } + } + } + + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LACUGROVE.bark); + } + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { return true; } - if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) { + if (EndBlocks.LACUGROVE.isTreeLog(state)) { + return true; + } + if (state.getBlock() == EndBlocks.LACUGROVE_LEAVES) { return true; } if (state.getMaterial().equals(Material.PLANT)) { @@ -93,6 +157,10 @@ public class LacugroveFeature extends DefaultFeature { return state.getMaterial().isReplaceable(); }; + IGNORE = (state) -> { + return EndBlocks.LACUGROVE.isTreeLog(state); + }; + POST = (info) -> { if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { return EndBlocks.LACUGROVE.log.getDefaultState(); diff --git a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java index a153aead..6cfc2e30 100644 --- a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java @@ -8,9 +8,7 @@ import net.minecraft.block.BlockState; 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; @@ -48,8 +46,6 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFPrimitive CONE_GLOW; private static final SDFPrimitive ROOTS; - private static final Mutable POS = new Mutable(); - @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { blockPos = getPosOnSurface(world, blockPos); @@ -75,33 +71,10 @@ public class MossyGlowshroomFeature extends DefaultFeature { Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(0.75F, 1.1F, random); - Vector3f vec = spline.get(0); - float x1 = blockPos.getX() + vec.getX() * scale; - float y1 = blockPos.getY() + vec.getY() * scale; - float z1 = blockPos.getZ() + vec.getZ() * scale; - for (int i = 1; i < count; i++) { - vec = spline.get(i); - float x2 = blockPos.getX() + vec.getX() * scale; - float y2 = blockPos.getY() + vec.getY() * scale; - float z2 = blockPos.getZ() + vec.getZ() * scale; - - for (float py = y1; py < y2; py += 3) { - if (py - blockPos.getY() < 10) continue; - float lerp = (py - y1) / (y2 - y1); - float x = MathHelper.lerp(lerp, x1, x2); - float z = MathHelper.lerp(lerp, z1, z2); - POS.set(x, py, z); - BlockState state = world.getBlockState(POS); - boolean generate = state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT); - if (!generate) { - return false; - } - } - - x1 = x2; - y1 = y2; - z1 = z2; + if (!SplineHelper.canGenerate(spline, scale, blockPos, world, REPLACE)) { + return false; } + BlocksHelper.setWithoutUpdate(world, blockPos, AIR); CENTER.set(blockPos.getX(), 0, blockPos.getZ()); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 8587e2ed..1940c347 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -100,7 +100,7 @@ public class LakePiece extends BasePiece { } minY = MathHelper.lerp(lerp, maxY - minY, 56 - minY); pos.setY(maxY); - while (chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { + while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { pos.setY(maxY ++); } for (int y = maxY; y >= minY; y--) { @@ -115,10 +115,19 @@ public class LakePiece extends BasePiece { break; } } + pos.setY(MHelper.floor(minY - 1)); + if (pos.getY() == 57 && chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { + BlockState state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + chunk.setBlockState(pos, state, false); + } if (pos.getY() < 57) { BlockState state = chunk.getBlockState(pos); if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, EndBlocks.ENDSTONE_DUST.getDefaultState(), false); + state = EndBlocks.ENDSTONE_DUST.getDefaultState(); + if (pos.getY() == 56 && random.nextBoolean()) { + state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + chunk.setBlockState(pos, state, false); pos.setY(pos.getY() - 1); state = chunk.getBlockState(pos); if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { @@ -126,7 +135,6 @@ public class LakePiece extends BasePiece { pos.setY(pos.getY() - 1); } if (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, Blocks.END_STONE.getDefaultState(), false); } } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 8cb7b596..8ff36d8b 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -219,5 +219,8 @@ "block.betterend.lacugrove_stairs": "Lacugrove Stairs", "block.betterend.lacugrove_stripped_bark": "Lacugrove Stripped Bark", "block.betterend.lacugrove_stripped_log": "Lacugrove Stripped Log", - "block.betterend.lacugrove_trapdoor": "Lacugrove Trapdoor" + "block.betterend.lacugrove_trapdoor": "Lacugrove Trapdoor", + + "block.betterend.lacugrove_leaves": "Lacugrove Leaves", + "block.betterend.lacugrove_sapling": "Lacugrove Sapling" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 9538b113..5f863b66 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -205,21 +205,24 @@ "block.betterend.eternal_pedestal": "Вечный пьедестал", "block.betterend.lacugrove_bark": "Кора оземангра", - "block.betterend.lacugrove_barrel": "Бочка", - "block.betterend.lacugrove_button": "Кнопка", - "block.betterend.lacugrove_chest": "Сундук", - "block.betterend.lacugrove_crafting_table": "Верстак", - "block.betterend.lacugrove_door": "Дверь", - "block.betterend.lacugrove_fence": "Забор", - "block.betterend.lacugrove_gate": "Калитка", - "block.betterend.lacugrove_ladder": "Лестница", - "block.betterend.lacugrove_log": "Бревно", - "block.betterend.lacugrove_planks": "Доски", - "block.betterend.lacugrove_plate": "Плита", - "block.betterend.lacugrove_sign": "Табличка", - "block.betterend.lacugrove_slab": "Плита", - "block.betterend.lacugrove_stairs": "Ступени", - "block.betterend.lacugrove_stripped_bark": "Обтёсанная кора", - "block.betterend.lacugrove_stripped_log": "Обтёсанное бревно", - "block.betterend.lacugrove_trapdoor": "Люк" + "block.betterend.lacugrove_barrel": "Бочка из оземангра", + "block.betterend.lacugrove_button": "Кнопка из оземангра", + "block.betterend.lacugrove_chest": "Сундук из оземангра", + "block.betterend.lacugrove_crafting_table": "Верстак из оземангра", + "block.betterend.lacugrove_door": "Дверь из оземангра", + "block.betterend.lacugrove_fence": "Забор из оземангра", + "block.betterend.lacugrove_gate": "Калитка из оземангра", + "block.betterend.lacugrove_ladder": "Лестница из оземангра", + "block.betterend.lacugrove_log": "Бревно оземангра", + "block.betterend.lacugrove_planks": "Доски из оземангра", + "block.betterend.lacugrove_plate": "Плита из оземангра", + "block.betterend.lacugrove_sign": "Табличка из оземангра", + "block.betterend.lacugrove_slab": "Плита из оземангра", + "block.betterend.lacugrove_stairs": "Ступени из оземангра", + "block.betterend.lacugrove_stripped_bark": "Обтёсанная кора оземангра", + "block.betterend.lacugrove_stripped_log": "Обтёсанное бревно оземангра", + "block.betterend.lacugrove_trapdoor": "Люк из оземангра", + + "block.betterend.lacugrove_leaves": "Листья оземангра", + "block.betterend.lacugrove_sapling": "Саженец оземангра" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png b/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..03c77b4261608b8fa5dae95f60345988cc52b8b7 GIT binary patch literal 2611 zcmb_e3s4hh9$%^;mD7__1w6dQ<;+x%WjEQ)W4A<#1PYu1#2`?sbhEo5t0WsY3j_+N z)LP^r?NRH%^r4^yX(`is+C#ZgEf$rbKCfClwMttbP&`k^Y6p({5|YeaYg@;;Og8)N zx4-}U_x=Cbl%D#`w5hYFLJ%}9IZ2-Z?lW9hU;y}i;?_6~ZjaiNavTs86ym!4pvE`C zASj@oH)c!OhQ$;kSfgoHFmcgNs~w;rC??ivr(!@3&$>$#W*RTz{*Lq%xTTHIVh(NcI&0U+O>_sGB-q8t%KuS z24&fXbXmM0axzu48etTKQl=rJ6>5xB5>YZGrqH06236n)rl2r2g_APR2L{$e)=XvS z6Fs)TlMc2>lAS`)qN1YcB0O3U^H2pzk|?G`l}ZF45J$01qMeA%5$V;S=Nyd4+a+GG z$y^#~lTaY(VBqOQ2v)mKtx%gM1EJK+E(Mp3v@m4yI zL+!Raw>5)-O13#9+Qx9ndL0a0jplil0+iL@1gSt&xWa^}m4pg0u?iKUz&R7A;>;MS zR(s|30#o2BqF0^;^0*l@DKNlH0#~t!QbiC5h{=o)8l0uI3Js=ZIInz~$b&;f=Rdq2 zUy-PIAzu&;0t>Q?yD03Y5|zX|K)s4RhhizW#S1wCtwc2EEUlr7ncXJ_#lizf6jjgUHHr1n>1z`SF1oXVK5Csst5%_ zDp?NEm`ob2iXcfXL3*SAsrP`RYVh^)?;*YSB$u(!wmc5>OcZ|jcpi+W_pQcH&(r@k z9@Nz>C#Z)0n1$|l|J7MRIo(^JUAvaPIRPGglZLZ_REc1Y>8-^q=Qj(y!ZwAQk4i@fB!1w-e{ z9)Y&CRR*@DoVqu+zrUYp2$-pl&nG>#Bp9`|&upegl~IRw<>U-3er2=#NMc20U@Q>>zdJY>@%xyT zb6cjGj~*DbUD6+n7{30+9cgjdrEdb$>c-kLZR_9dz4%yRY{0SZ%C@Gq>}8Du&YG*c z4LzR*{JHP3*7kWHeOR#~DzdgLch${1YhT+PzUj>nV_G1 z?9-0!cY@D-Hc&aZ;YDZ6%5UGlJs(=P{DS%N=Tuh5#i#W%g5}S~&KUY=2{~%$C`s9= zOt>=l%jB7d!^5kp>GwKwAn4#V;`N4g((KHgXZkIDiP?VQ?x3VBd6Q~oEdD`Yy)G16 z_WIqgPp0(*CH%XKsMxdj=&CckAEdQyB>4SNzs)tj)1FxhZ51vw?Q5%AG;sOjr`K(( z=ME)(rH8xzm5R?PObWRdlY3fo`0Sxz$y$4LU=CDzv-GXT>#I_}nNtzEQLl%-TEF7z z(zKJWK6>r;zPO_`ab=ToA{Tv01h$Hn=hMs9zDf3;Zg~@ip_qYFyLubzK71|Zcz4SZ z^(}wXkerO{!7q-t7VIhLlI{?jp4C`AL~E39{>OV literal 0 HcmV?d00001