diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 6a443abd..e128b0c5 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -36,6 +36,7 @@ import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.BushWithOuterFeature; import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; @@ -87,6 +88,7 @@ public class EndFeatures { public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); + public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 594b14d4..da8dd315 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -4,6 +4,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; public class LanternWoodsBiome extends EndBiome { @@ -15,11 +16,12 @@ public class LanternWoodsBiome extends EndBiome { .setPlantsColor(237, 122, 66) .setSurface(EndBlocks.RUTISCUS) .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.0005F) + .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.LUCERNIA) + .addFeature(EndFeatures.LUCERNIA_BUSH) .addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.ORANGO) .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS) .addFeature(EndFeatures.LAMELLARIUM) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java new file mode 100644 index 00000000..024fcbe3 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -0,0 +1,100 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +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.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class BushWithOuterFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); + private static final Function REPLACE; + private final Block outer_leaves; + private final Block leaves; + private final Block stem; + + public BushWithOuterFeature(Block leaves, Block outer_leaves, Block stem) { + this.outer_leaves = outer_leaves; + this.leaves = leaves; + this.stem = stem; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float radius = MHelper.randRange(1.8F, 3.5F, random); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); + sphere = new SDFScale3D().setScale(1, 0.5F, 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 MHelper.randRange(-2F, 2F, random); }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere.setReplaceFunction(REPLACE); + sphere.addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getPos().getManhattanDistance(pos); + if (distance < 7) { + return info.getState().with(LeavesBlock.DISTANCE, distance); + } + else { + return AIR; + } + } + return info.getState(); + }).addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + MHelper.shuffle(DIRECTIONS, random); + for (Direction dir: DIRECTIONS) { + if (info.getState(dir).isAir()) { + info.setBlockPos(info.getPos().offset(dir), outer_leaves.getDefaultState().with(Properties.FACING, dir)); + } + } + } + return info.getState(); + }); + sphere.fillRecursive(world, pos); + BlocksHelper.setWithoutUpdate(world, pos, stem); + for (Direction d: Direction.values()) { + BlockPos p = pos.offset(d); + if (world.isAir(p)) { + if (leaves instanceof LeavesBlock) { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + } + else { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState()); + } + } + } + + return true; + } + + static { + REPLACE = (state) -> { + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java deleted file mode 100644 index 75ace9c2..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.FullHeightScatterFeature; - -public class CaveBushFeature extends FullHeightScatterFeature { - public CaveBushFeature(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.getBlockState(blockPos.down()).isOf(EndBlocks.CAVE_MOSS); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(0.8F, 2.5F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).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.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos); - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java deleted file mode 100644 index fac99a1b..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.InvertedScatterFeature; - -public class CaveBushFeatureCeil extends InvertedScatterFeature { - public CaveBushFeatureCeil(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos.down()) - && world.getBlockState(blockPos.up()).isIn(EndTags.GEN_TERRAIN) - && world.getBlockState(blockPos.down(BlocksHelper.downRay(world, blockPos.down(), 64) + 2)).isIn(EndTags.GEN_TERRAIN); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(1.0F, 3.2F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).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.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos.down()); - BlocksHelper.setWithoutUpdate(world, blockPos.down(), EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/resources/assets/betterend/blockstates/rutiscus.json b/src/main/resources/assets/betterend/blockstates/rutiscus.json new file mode 100644 index 00000000..a4aac58f --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/rutiscus.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/rutiscus_1" }, + { "model": "betterend:block/rutiscus_1", "y": 90 }, + { "model": "betterend:block/rutiscus_1", "y": 180 }, + { "model": "betterend:block/rutiscus_1", "y": 270 }, + { "model": "betterend:block/rutiscus_2" }, + { "model": "betterend:block/rutiscus_2", "y": 90 }, + { "model": "betterend:block/rutiscus_2", "y": 180 }, + { "model": "betterend:block/rutiscus_2", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_1.json b/src/main/resources/assets/betterend/models/block/rutiscus_1.json new file mode 100644 index 00000000..c49ecd73 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_1.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_1", + "north": "betterend:block/rutiscus_side_1", + "particle": "betterend:block/rutiscus_side_1", + "south": "betterend:block/rutiscus_side_1", + "up": "betterend:block/rutiscus_top_1", + "west": "betterend:block/rutiscus_side_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_2.json b/src/main/resources/assets/betterend/models/block/rutiscus_2.json new file mode 100644 index 00000000..c649a3c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_2.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_2", + "north": "betterend:block/rutiscus_side_2", + "particle": "betterend:block/rutiscus_side_2", + "south": "betterend:block/rutiscus_side_2", + "up": "betterend:block/rutiscus_top_2", + "west": "betterend:block/rutiscus_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/item/rutiscus.json b/src/main/resources/assets/betterend/models/item/rutiscus.json new file mode 100644 index 00000000..3a6c5939 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/rutiscus.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/rutiscus_1" +} diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png index 4a47f30b..2f40c5c9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png and b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_middle.png b/src/main/resources/assets/betterend/textures/block/filalux_middle.png index 09bcde64..143f9c3b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_middle.png and b/src/main/resources/assets/betterend/textures/block/filalux_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings.png b/src/main/resources/assets/betterend/textures/block/filalux_wings.png index 580e1ab2..c3d0481c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png index 0ba4a1ab..8f0cbfd5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png index e42dbde7..0755a838 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png index c90c827a..7b66a845 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png index 23c38e41..9cd3b55d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png index d319dab6..c72847e2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png index 2a931f97..fcc3867a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png index e2ca2b35..79ed8509 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png index d52d30d6..cf12ad7d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png index 68a3a16a..8c15baec 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png new file mode 100644 index 00000000..de06738a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png new file mode 100644 index 00000000..307f4088 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png new file mode 100644 index 00000000..9e1cc429 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png new file mode 100644 index 00000000..fe9a86c5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png differ