diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index d3935e5d..3caf4d36 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -20,6 +20,7 @@ import ru.betterend.world.features.EndLilyFeature; import ru.betterend.world.features.EndLotusFeature; import ru.betterend.world.features.EndLotusLeafFeature; import ru.betterend.world.features.EndPortalFeature; +import ru.betterend.world.features.LacugroveFeature; import ru.betterend.world.features.MossyGlowshroomFeature; import ru.betterend.world.features.PythadendronBushFeature; import ru.betterend.world.features.PythadendronTreeFeature; @@ -32,6 +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); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4); diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index f2c4d272..6469cf54 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -21,6 +21,7 @@ public class BiomeMegalake extends EndBiome { .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) .addStructureFeature(EndStructures.MEGALAKE) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) .addFeature(EndFeatures.BUBBLE_CORAL_RARE) diff --git a/src/main/java/ru/betterend/world/features/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/LacugroveFeature.java new file mode 100644 index 00000000..27f198a7 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/LacugroveFeature.java @@ -0,0 +1,103 @@ +package ru.betterend.world.features; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +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.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; + +public class LacugroveFeature extends DefaultFeature { + private static final Function REPLACE; + private static final Function POST; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) return false; + + 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); + SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { + return EndBlocks.LACUGROVE.bark.getDefaultState(); + }); + function.setReplaceFunction(REPLACE); + function.setPostProcess(POST); + function.fillRecursive(world, pos); + + Mutable mut = new Mutable(); + int offset = random.nextInt(2); + for (int i = 0; i < 100; i++) { + double px = pos.getX() + MHelper.randRange(-5, 5, random); + double pz = pos.getZ() + MHelper.randRange(-5, 5, random); + mut.setX(MHelper.floor(px + 0.5)); + mut.setZ(MHelper.floor(pz + 0.5)); + if (((mut.getX() + mut.getZ() + offset) & 1) == 0) { + double distance = 3.5 - MHelper.length(px - pos.getX(), pz - pos.getZ()) * 0.5; + if (distance > 0) { + int minY = MHelper.floor(pos.getY() - distance * 0.5); + int maxY = MHelper.floor(pos.getY() + distance + random.nextDouble()); + boolean generate = false; + for (int y = minY; y < maxY; y++) { + mut.setY(y); + if (world.getBlockState(mut).isIn(EndTags.END_GROUND)) { + generate = true; + break; + } + } + if (generate) { + int top = maxY - 1; + for (int y = top; y >= minY; y--) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) || state.isIn(EndTags.END_GROUND)) { + BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); + } + else { + break; + } + } + } + } + } + } + + return true; + } + + static { + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND)) { + return true; + } + if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) { + return true; + } + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + POST = (info) -> { + if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { + return EndBlocks.LACUGROVE.log.getDefaultState(); + } + return info.getState(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/PythadendronTreeFeature.java index e0b4b557..7fdb0a05 100644 --- a/src/main/java/ru/betterend/world/features/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/PythadendronTreeFeature.java @@ -18,6 +18,7 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; 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.SDFScale3D; @@ -27,6 +28,7 @@ import ru.betterend.util.sdf.primitive.SDFSphere; public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; + private static final Function POST; @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { @@ -44,14 +46,8 @@ public class PythadendronTreeFeature extends DefaultFeature { SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> { return EndBlocks.PYTHADENDRON.bark.getDefaultState(); }); - function.setPostProcess((info) -> { - if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { - return EndBlocks.PYTHADENDRON.log.getDefaultState(); - } - return info.getState(); - }); - function.setReplaceFunction(REPLACE); + function.setPostProcess(POST); function.fillRecursive(world, pos); return true; @@ -86,39 +82,9 @@ public class PythadendronTreeFeature extends DefaultFeature { if (depth < 3) { if (s1) { leavesBall(world, pos.add(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise); - /*float radius = MHelper.randRange(4.5F, 6.5F, random); - - if (radius > 5) { - for (int i = 0; i < 10; i++) { - BlockPos p = pos.add(pos1.getX() + random.nextGaussian() * 2, pos1.getY() + random.nextGaussian() * 2, pos1.getZ() + random.nextGaussian() * 2); - BlocksHelper.setWithoutUpdate(world, p, BlockRegistry.PYTHADENDRON.bark); - } - } - - SDF sphere = new SDFSphere().setRadius(radius).setBlock(BlockRegistry.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1)); - sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); - 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, 0).setSource(sphere)); - sphere.fillRecursive(world, new BlockPos(pos1.getX() + pos.getX(), pos1.getY() + pos.getY() + 1, pos1.getZ() + pos.getZ()));*/ } if (s2) { leavesBall(world, pos.add(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise); - /*float radius = MHelper.randRange(4.5F, 6.5F, random); - - if (radius > 5) { - for (int i = 0; i < 10; i++) { - BlockPos p = pos.add(pos1.getX() + random.nextGaussian() * 2, pos1.getY() + random.nextGaussian() * 2, pos1.getZ() + random.nextGaussian() * 2); - BlocksHelper.setWithoutUpdate(world, p, BlockRegistry.PYTHADENDRON.bark); - } - } - - SDF sphere = new SDFSphere().setRadius(radius).setBlock(BlockRegistry.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1)); - sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); - 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, 0).setSource(sphere)); - sphere.fillRecursive(world, new BlockPos(pos2.getX() + pos.getX(), pos2.getY() + pos.getY() + 1, pos2.getZ() + pos.getZ()));*/ } } @@ -168,5 +134,12 @@ public class PythadendronTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; + + POST = (info) -> { + if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { + return EndBlocks.PYTHADENDRON.log.getDefaultState(); + } + return info.getState(); + }; } } diff --git a/src/main/resources/assets/betterend/blockstates/lacugrove_bark.json b/src/main/resources/assets/betterend/blockstates/lacugrove_bark.json new file mode 100644 index 00000000..b657f588 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lacugrove_bark.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/lacugrove_bark", "x": 90, "y": 90 }, + { "model": "betterend:block/lacugrove_bark_2", "x": 90, "y": 90 }, + { "model": "betterend:block/lacugrove_bark_3", "x": 90, "y": 90 }, + { "model": "betterend:block/lacugrove_bark_4", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/lacugrove_bark" }, + { "model": "betterend:block/lacugrove_bark_2" }, + { "model": "betterend:block/lacugrove_bark_3" }, + { "model": "betterend:block/lacugrove_bark_4" } + ], + "axis=z": [ + { "model": "betterend:block/lacugrove_bark", "x": 90 }, + { "model": "betterend:block/lacugrove_bark_2", "x": 90 }, + { "model": "betterend:block/lacugrove_bark_3", "x": 90 }, + { "model": "betterend:block/lacugrove_bark_4", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/lacugrove_bark.json b/src/main/resources/assets/betterend/models/block/lacugrove_bark.json new file mode 100644 index 00000000..3ea859cf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lacugrove_bark.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lacugrove_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lacugrove_bark_2.json b/src/main/resources/assets/betterend/models/block/lacugrove_bark_2.json new file mode 100644 index 00000000..119ec542 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lacugrove_bark_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lacugrove_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lacugrove_bark_3.json b/src/main/resources/assets/betterend/models/block/lacugrove_bark_3.json new file mode 100644 index 00000000..a37fb3bf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lacugrove_bark_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lacugrove_log_side_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lacugrove_bark_4.json b/src/main/resources/assets/betterend/models/block/lacugrove_bark_4.json new file mode 100644 index 00000000..7747d493 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lacugrove_bark_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lacugrove_log_side_4" + } +}